什么是深度模板视图

时间:2013-11-20 20:34:32

标签: c++ direct3d

此代码出现在由默认的windows phone 8 direct3d项目创建的Direct3DBase类的编写中:

// Create a depth stencil view.
CD3D11_TEXTURE2D_DESC depthStencilDesc(
    DXGI_FORMAT_D24_UNORM_S8_UINT,
    static_cast<UINT>(m_renderTargetSize.Width),
    static_cast<UINT>(m_renderTargetSize.Height),
    1,
    1,
    D3D11_BIND_DEPTH_STENCIL
    );

ComPtr<ID3D11Texture2D> depthStencil;
DX::ThrowIfFailed(
    m_d3dDevice->CreateTexture2D(
        &depthStencilDesc,
        nullptr,
        &depthStencil
        )
    );

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

什么是深度模板视图?

1 个答案:

答案 0 :(得分:7)

D3D11分离了资源(基本上只是内存块)和视图(从视图管道的不同部分“查看”或访问这些内存块的方式)的概念。在此示例中,资源是所需宽度,高度和格式的2D纹理,视图是该纹理上的深度模板视图。

当您想渲染某些内容时,通过调用ID3D11DeviceContext::OMSetRenderTargets()将渲染目标视图和深度模板视图绑定到管道,从而将指定视图的后备资源绑定为渲染目标和深度/模板缓冲区。

当你想要做更复杂的事情,例如将纹理数组的绑定切片作为渲染目标或深度模板缓冲区,在帧中的不同阶段以不同方式重新解释相同的资源内存时,这种解耦的优势才真正变得明显。它也使得使用渲染目标或深度模板缓冲区作为纹理比使用D3D9时更简单,更少特殊情况的相当普遍的情况。