深度/模板状态
1. 深度/模板描述
当创建ID3D11DepthStencilState接口时,第一步是要填充一个D3D11_DEPTH_STENCIL_DESC实例:
typedef struct D3D11_DEPTH_STENCIL_DESC{
BOOL DepthEnable;//默认True
// 默认:D3D11_DEPTH_WRITE_MASK_ALL
D3D11_DEPTH_WRITE_MASK DepthWriteMask;
// 默认:D3D11_COMPARISON_LESS
D3D11_COMPARISON_FUNC DepthFunc;
BOOL StencilEnable;// 默认:False
UINT8 StencilReadMask;// 默认:0xff
UINT8 StencilWriteMask;// 默认:0xff
D3D11_DEPTH_STENCILOP_DESC FrontFace;
D3D11_DEPTH_STENCILOP_DESC BackFace;
}D3D11_DEPTH_STENCIL_DESC;
2. 深度设置
1.DepthEnable:当设为true时,表示启用深度测试;当设为false时,表示禁用深度测试。当禁用深度测试时,绘图顺序非常重要,因为在这种情况下障碍物后面的像素片段也会被绘制出来(回顾4.1.5节)。如果禁用深度测试,那么无论DepthWriteMask设定何值,深度缓冲区中的元素都不会被更新。
2.DepthWriteMask:可设为D3D11_DEPTH_WRITE_MASK_ZERO或D3D11_DEPTH_WRITE_MASK_ALL。这两个标志值不能同时使用。当DepthEnable设为true时,D3D11_DEPTH_WRITE_MASK_ZERO表示禁用深度缓冲区的写入功能,但深度测试依然有效。D3D11_DEPTH_WRITE_MASK_ALL表示启用深度缓冲区的写入功能;当深度/模板测试都通过时,新的深度值会被写入深度缓冲区。
3.DepthFunc:一个用于描述深度测试函数的D3D11_COMPARISON_FUNC枚举类型成员。我们一般使用D3D11_COMPARISON_LESS实现普通的深度测试,如4.1.5节所述。也就是,当像素片段的深度值比之前写入后台缓冲区的像素的深度值小时,接受该像素片段(即,将该像素片段写入后台缓冲区