我需要澄清一下direct3D 11 (c++)中深度/模板缓冲区的概念
I need some clarification with the concept of depth/stencil buffers in direct3D 11 (c++)
我正在遵循在线教程来帮助我创建我的第一款游戏,到目前为止,我理解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;
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 从OpenGL应用程序中提取颜色/深度缓冲区
- 为什么为什么偏离gl_fragcoord.z偏离深度缓冲区
- DirectX-启用深度缓冲区后没有任何渲染
- OpenGL - 深度缓冲区在渲染半透明立方体时剪切掉不应该剪切的面
- C++深度缓冲区Oculus Rift DK2 VR HMD
- 多采样框架渲染对象和深度缓冲区
- GlReadPixel始终从深度缓冲区0中获取
- 有没有办法访问OpenGL的深度缓冲区
- Qopenglwidget和GlreadPixels和深度缓冲区
- 深度缓冲区的绝对距离
- 弄乱了OpenGL深度缓冲区
- OpenGL:只获取模具缓冲区而不获取深度缓冲区
- 使用帧缓冲区将深度缓冲区渲染到纹理中
- 是否可以在opengl中使用深度缓冲区渲染3D纹理
- Direct2D深度缓冲区
- OpenGL ES深度缓冲区渲染(iOS模拟器与真实设备)
- 深度缓冲区未正确渲染
- 将深度呈现缓冲区复制到深度缓冲区
- 为什么我们必须在渲染过程中清除 OpenGL 中的深度缓冲区