我在网上关注教程以帮助我创建我的第一个游戏,到目前为止,我理解Direct3D 11必须向我投射的每个概念。
但是有一个我似乎无法完全掌握的概念;深度/模板缓冲区。
我知道深度/模板缓冲区用于"比较"来自游戏中不同对象的像素深度。如果两个对象彼此重叠,则像素中具有较小深度的对象将显示为更靠近相机。并通过填写D3D11_TEXTURE2D_DESC来定义深度/模板缓冲区..
但我的问题是;如果我填写D3D11_TEXTURE2D_DESC结构,那么我是否告诉directX HOW 来比较游戏中不同对象的像素?
如果您不理解我的问题,请尽量解释深度/模板缓冲区的概念。还请尝试通过填写D3D11_TEXTURE2D_DESC结构来解释我的定义
谢谢。
答案 0 :(得分:0)
当你填写D3D11_TEXTURE2D_DESC
时,你正在描述深度/模板缓冲区本身:它有多大,它使用什么格式,你想如何将它绑定到管道。
锅炉板'对此的构造如下(使用C ++等效CD3D11_TEXTURE2D_DESC
CD3D11_TEXTURE2D_DESC depthStencilDesc(depthBufferFormat,
backBufferWidth, backBufferHeight, 1, 1,
D3D11_BIND_DEPTH_STENCIL);
ComPtr<ID3D11Texture2D> depthStencil;
DX::ThrowIfFailed(
m_d3dDevice->CreateTexture2D(&depthStencilDesc, nullptr,
depthStencil.GetAddressOf()));
depthBufferFormat 取决于您想要的精度级别,无论您使用的是模板缓冲区还是Direct3D Feature Level。模板默认使用DXGI_FORMAT_D24_UNORM_S8_UINT
,它适用于所有要素叶,并提供合理的深度精度和8位模板。大小必须与您的颜色后缓冲区完全匹配。
通过创建一个&#39;视图来将深度模板缓冲区绑定到渲染管道。对于缓冲区。
CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D);
DX::ThrowIfFailed(
m_d3dDevice->CreateDepthStencilView(depthStencil.Get(),
&depthStencilViewDesc, m_depthStencilView.ReleaseAndGetAddressOf()));
然后你清楚&#39;每个帧的视图,然后绑定视图进行渲染:
m_d3dContext->ClearDepthStencilView(m_depthStencilView.Get(),
D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_d3dContext->OMSetRenderTargets(1, m_renderTargetView.GetAddressOf(),
m_depthStencilView.Get());
您告诉Direct3D 如何与D3D11_DEPTH_STENCIL_DESC
(或等效的C ++ D3D11_DEPTH_STENCIL_DESC
)进行比较。
&#39;默认&#39;深度/模板状态是:
DepthEnable = TRUE;
DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
DepthFunc = D3D11_COMPARISON_LESS;
StencilEnable = FALSE;
StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
const D3D11_DEPTH_STENCILOP_DESC defaultStencilOp =
{ D3D11_STENCIL_OP_KEEP,
D3D11_STENCIL_OP_KEEP,
D3D11_STENCIL_OP_KEEP,
D3D11_COMPARISON_ALWAYS };
FrontFace = defaultStencilOp;
BackFace = defaultStencilOp;
在DirectX Tool Kit中,我们提供了三种常见的深度状态:
// DepthNone
CD3D11_DEPTH_STENCIL_DESC desc(default);
desc.DepthEnable = FALSE;
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
// DepthDefault
CD3D11_DEPTH_STENCIL_DESC desc(default);
desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
// DepthRead
CD3D11_DEPTH_STENCIL_DESC desc(default);
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;