要描述深度/模板状态,就需要填写D3D12_DEPTH_STENCIL_DESC实例
typedef struct D3D12_DEPTH_STENCIL_DESC
{
BOOL DepthEnable;//默认值TRUE
D3D12_DEPTH_WRITE_MASK DepthWriteMask;//默认值D3D12_DEPTH_WRITE_MASK_ALL
D3D12_COMPARISON_FUNC DepthFunc;//默认值D3D12_COMPARISON_FUNC_LESS
BOOL StencilEnable;//默认值FALSE
UINT8 StencilReadMask;//默认值D3D12_DEFAULT_STENCIL_READ_MASK
UINT8 StencilWriteMask;//默认值D3D12_DEFAULT_STENCIL_WRITE_MASK
D3D12_DEPTH_STENCILOP_DESC FrontFace;//默认值
//FrontFace.StencilFailOp D3D12_STENCIL_OP_KEEP
//FrontFace.StencilDepthFailOp D3D12_STENCIL_OP_KEEP
//FrontFace.StencilPassOp D3D12_STENCIL_OP_KEEP
//FrontFace.StencilFunc D3D12_COMPARISON_FUNC_ALWAYS
D3D12_DEPTH_STENCILOP_DESC BackFace;//默认值
//BackFace.StencilFailOp D3D12_STENCIL_OP_KEEP
//BackFace.StencilDepthFailOp D3D12_STENCIL_OP_KEEP
//BackFace.StencilPassOp D3D12_STENCIL_OP_KEEP
//BackFace.StencilFunc D3D12_COMPARISON_FUNC_ALWAYS
}
支持模板化的格式为DXGI_FORMAT_D24_UNORM_S8_UINT和DXGI_FFORMAT_D32_FLOAT_S8X24_UINT。
1.DepthEnable:设置为true,则开启深度缓冲;设置为false,则禁用。当深度测试被禁止时, 物体的绘制顺序就变得极为重要,否则位于遮挡物之后的像素片段也将被绘制出来。如果深度缓冲被禁用,则深度缓冲区中的元素便不会被更新,DepthWriteMask项的设 置也不会起作用。
2.DepthWriteMask:可将此参数设置为 D3D12_DEPTH_WRITE_MASK_ZERO 或者 D3D12_DEPTH_ WRITE_MASK_ALL,但两者不能共存。假设DepthEnable为true ,若把此参数设置为 D3D12_DEPTH_WRITE_MASK_ZERO便会禁止对深度缓冲区的写操作,但仍可执行深度测 试;若将该项设为D3D12_DEPTH_WRITE_MASK_ALL,则通过深度测试与模板测试的深度 数据将被写入深度缓冲区。这种控制深度数据读写的能力,为某些特效的实现提供了良好的 契机。
3.DepthFunc:将该参数指定为枚举类型D3DI2_COMPARISON_FUNC的成员之一,以此来定义 深度测试所用的比较函数。此项一般被设为D3D12_COMPARISON_FUNC_LESS,因而常常执行深度测试。即,若给定像素片段的深度值小于位于深度缓冲区中对应像素的深度值,则接受该像素片段(离摄像机近的物体遮挡距摄像机远的物体)。当然,也正如我们 所看到的,Direct3D也允许用户根据需求来自定义深度测试。
1.StencilEnable:设置为true,则开启模板测试;设置为false,则禁用。
2.StencilReadMask:用于读取模具数据的深度模具缓冲区的一部分,默认则不会屏蔽任何一位模板值。D3DI2_DEFAULT_STENCIL_READ_MASK ( Oxff )
3.StehcilWriteMask:当模板缓冲区被更新时,我们可以通过写掩码(write mask )来屏蔽特 定位的写入操作。例如,如果我们希望防止前4位数据被改写,便可以将写掩码设置为OxOf。 而默认配置是不会屏蔽任何一位模板值的:D3D12_DEFAULT_STENCIL_WRITE_MASK ( Oxff )
4.FrontFace:填写一个D3D12_DEPTH_STENCILOP_DESC结构体实例,以指示根据模板测试 与深度测试的结果,应对正面朝向的三角形要进行何种模板运算。
5.BackFace:填写一个D3D12_DEPTH_STENCILOP_DESC结构体实例,以指出根据模板测试 与深度测试的结果,应对背面朝向的三角形要进行何种模板运算。
typedef struct D3D12_DEPTH_STENCILOP_DESC
{
D3D12_STENCIL_OP StencilFailOp;//默认值D3D12_STENCIL_OP_KEEP
D3D12_STENCIL_OP StencilDepthFailOp;//默认值D3D12_STENCIL_OP_KEEP
D3D12_STENCIL_OP StencilPassOp;//默认值D3D12_STENCIL_OP_KEEP
D3D12_COMPARISON_FUNC StencilFunc;//默认值 D3D12_COMPARISON_FUNC_ALWAYS
}
1.StencilFailOp:用于标识模具测试失败时要执行的模具操作。
2.StencilDepthFailOp:用于标识模具测试通过时要执行的模具操作,深度测试失败。、
3.StencilPassOp:用于标识模具测试和深度测试两者都通过时要执行的模具操作。
4.StencilFunc:用于标识将模具数据与现有模具数据进行比较的函数。
enum D3D12_STENCIL_OP
{
D3D12_STENCIL_OP_KEEP = 1,
D3D12_STENCIL_OP_ZERO = 2,
D3D12_STENCIL_OP_REPLACE = 3,
D3D12_STENCIL_OP_INCR_SAT = 4,
D3D12_STENCIL_OP_DECR_SAT = 5,
D3D12_STENCIL_OP_INVERT = 6,
D3D12_STENCIL_OP_INCR = 7,
D3D12_STENCIL_OP_DECR = 8
}
1.D3D12_STENCIL_OP_KEEP:不修改模板缓冲区,即保持当前的数据。
2.D3D12_STENCIL_OP_ZERO:将模板缓冲区中的元素设置为0。
3.D3D12_STENCIL_OP_REPLACE:将模板缓冲区中的元素替换为用于模板测试的模板参考值(StencilRef )。注意,只有当我们将深度/模板缓冲区状态块绑定到渲染流水线时,才能够设定StencilRef值。
4.D3D12_STENCIL_OP_INCR_SAT:对模板缓冲区中的元素进行递增(increment)操作。如果 递增值超岀最大值(例如,8位模板缓冲区的最大值为255),则将此模板缓冲区元素限定为最 大值。
5.D3D12_STENCIL_OP_DECR_SAT:对模板缓冲区中的元素进行递减(decrement)操作。如果 递减值小于0,则将该模板缓冲区元素限定为0。
6.D3D12_STENCIL_OP_INVERT:对模板缓冲区中的元素数据按二进制位进行反转。
7.D3D12_STENCIL_OP_INCR:对模板缓冲区中的元素进行递增操作。如果递增值超出最大值(例 如,对于8位模板缓冲区而言,其最大值为255),则环回至0。
8.D3D12_STENCIL_OP_DECR:对模板缓冲区中的元素进行递减操作。如果递减值,小于0,则环 回至可取到的最大值。
enum D3D12_COMPARISON_FUNC
{
D3D12_COMPARISON_FUNC_NEVER = 1,
D3D12_COMPARISON_FUNC_LESS = 2,
D3D12_COMPARISON_FUNC_EQUAL = 3,
D3D12_COMPARISON_FUNC_LESS_EQUAL = 4,
D3D12_COMPARISON_FUNC_GREATER = 5,
D3D12_COMPARISON_FUNC_NOT_EQUAL = 6,
D3D12_COMPARISON_FUNC_GREATER_EQUAL = 7,
D3D12_COMPARISON_FUNC_ALWAYS = 8
}
1.D3D12_COMPARISON_FUNC_NEVER :不比较
2.D3D12_COMPARISON_FUNC_LESS :如果源数据小于目标数据,则比较会通过。
3.D3D12_COMPARISON_FUNC_EQUAL:如果源数据等于目标数据,则比较会传递。
4.D3D12_COMPARISON_FUNC_LESS_EQUAL:如果源数据小于或等于目标数据,则比较会传递。
5.D3D12_COMPARISON_FUNC_GREATER:如果源数据大于目标数据,则比较会通过。
6.D3D12_COMPARISON_FUNC_GREATER_EQUAL:如果源数据不等于目标数据,则比较会传递。
7.D3D12_COMPARISON_FUNC_GREATER_EQUAL:如果源数据大于或等于目标数据,则比较会传递。
8.D3D12_COMPARISON_FUNC_ALWAYS:始终传递比较。
通过观察能够看出,对正面朝向三角形与背面朝向三角形所进行的模板运算可以是互不相 同的。由于在执行背面剔除后背面朝向的多边形并不会得到渲染,所以在这种情况下对 BackFace的设置便是无足轻重的。然而,我们有时候却需要针对特定的图形学算法或 透明几何体(例如铁丝网盒,我们能透过它看到其背后的面)的处理来渲染背面朝向的多 边形。而此时对BackFace的设置则又变得特别重要。