我需要澄清一下direct3D 11 (c++)中深度/模板缓冲区的概念

I need some clarification with the concept of depth/stencil buffers in direct3D 11 (c++)

本文关键字:深度 缓冲区 c++ direct3D 一下      更新时间:2023-10-16

我正在遵循在线教程来帮助我创建我的第一款游戏,到目前为止,我理解Direct3D 11必须向我抛出的每个概念。

但是有一个概念我似乎还不能完全理解;深度/模板缓冲区

我知道深度/模板缓冲用于"比较"游戏中不同对象的像素深度。如果两个对象相互重叠,那么像素深度较低的对象将显示更靠近相机。通过填写D3D11_TEXTURE2D_DESC..

来定义深度/模板缓冲区。

但我的问题是;如果我填写D3D11_TEXTURE2D_DESC结构,那么我是否告诉directX 如何比较游戏中不同对象的像素?

如果你不明白我的问题,请试着解释深度/模板缓冲区的概念,尽可能简单。另外,请尝试通过填写D3D11_TEXTURE2D_DESC结构来解释我到底定义了什么

谢谢。

当你填写D3D11_TEXTURE2D_DESC时,你是在描述深度/模板缓冲区本身:它有多大,它使用什么格式,你想如何将它绑定到管道。

这个"锅炉板"的结构如下(取自Direct3D Win32 Game Visual Studio模板,使用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功能级别决定。模板默认使用DXGI_FORMAT_D24_UNORM_S8_UINT,它适用于所有特征叶,并提供合理的深度精度和8位模板。大小必须与你的颜色完全匹配。

你可以通过为buffer创建一个'view'来将depth-stencil buffer绑定到渲染管道。

CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D);
DX::ThrowIfFailed(
    m_d3dDevice->CreateDepthStencilView(depthStencil.Get(),
         &depthStencilViewDesc, m_depthStencilView.ReleaseAndGetAddressOf()));

然后每帧"清除"视图,然后绑定视图进行渲染:

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)进行比较。

默认深度/模板状态为:

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工具包中,我们提供了三种常见的深度状态:
// 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;