我需要对direct3D 11(c ++)

时间:2015-07-13 01:22:03

标签: c++ direct3d direct3d11

我在网上关注教程以帮助我创建我的第一个游戏,到目前为止,我理解Direct3D 11必须向我投射的每个概念。

但是有一个我似乎无法完全掌握的概念;深度/模板缓冲区。

我知道深度/模板缓冲区用于"比较"来自游戏中不同对象的像素深度。如果两个对象彼此重叠,则像素中具有较小深度的对象将显示为更靠近相机。并通过填写D3D11_TEXTURE2D_DESC来定义深度/模板缓冲区..

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

如果您不理解我的问题,请尽量解释深度/模板缓冲区的概念。还请尝试通过填写D3D11_TEXTURE2D_DESC结构来解释我的定义

谢谢。

1 个答案:

答案 0 :(得分:0)

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

锅炉板'对此的构造如下(使用C ++等效CD3D11_TEXTURE2D_DESC

Direct3D Win32 Game Visual Studio template获取
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;