管线状态配置
DSHL 有一些状态变量,用于配置固定的流水线阶段(混合、深度/模版测试等)。 您可以选择在着色器中定义它们。
混合
可使用以下语法在 DSHL 着色器中配置混合设置:
blend_target = blend_factor;
其中 blend_target 是这些状态变量之一
blend_src- 混合源blend_dst– 混合目的地blend_asrc– 混合阿尔法源blend_adst– 混合 alpha 目的地
和 blend_factor 是这些关键字之一:
其中
(R_d, G_d, B_d)``和 ``A_d代表目标(当前渲染目标中的旧值)的 R、G、B、A 分量
混合使用以下伪代码执行:
if (blendEnable) {
finalColor.rgb = (srcColorBlendFactor * srcColor.rgb) <colorBlendOp> (dstColorBlendFactor * dstColor.rgb);
finalColor.a = (srcAlphaBlendFactor * srcColor.a) <alphaBlendOp> (dstAlphaBlendFactor * dstCoilor.a);
} else {
finalColor = srcColor;
}
finalColor = finalColor & colorWriteMask;
示例:
blend_src = sa; blend_dst = 1;
blend_asrc = sa; blend_adst = 1;
Warning
混合**操作**(以及 bf 和 ibf 混合模式的混合常数)需要在 C++ 代码中配置。
如果不在着色器中配置混合因子,则将使用这些默认值:
blend_src = 1; blend_dst = 0;
blend_asrc = 1; blend_adst = 0;
独立混合
Dagor 支持独立混合,即不同的渲染目标可以有不同的混合设置。
这可以通过使用 [] 操作符为 blend_src, blend_dst, blend_asrc, blend_adst 变量提供索引来实现。
blend_src[0] = 1; blend_dst[0] = 0;
blend_src[1] = 0; blend_dst[1] = 1;
如果没有索引,所需的混合因子会影响所有渲染目标。
深度/模版
深度和模版测试也可以使用类似的语法在 DSHL 中配置。
深度状态变量
z_write – 启用/禁用写入深度缓冲区。有效值:true / false。默认值:true.
z_test – 启用/禁用深度测试。有效值: true / false。默认值:true`。
z_func – 指定用于深度测试的比较功能。有效值:
equale的值为 \(\text{reference} = \text{test}\)notequal的值为 \(\text{reference} \neq \text{test}\)always的值始终为true
默认值是 ``GREATER_OR_EQUAL``(求值为 \(\text{reference} \geq \text{test}\))。 请注意,这个值不能显式设置,因为它是默认行为、 因为达戈遵循的惯例是,**接近**的对象具有**更多**深度值。
示例:
z_write = false;
z_test = true;
z_func = always;
模板状态变量*
stencil – 启用/禁用模版测试。有效值: true / false。默认值: false.
stencil_func – 指定模版测试的比较函数。有效值:
never的值始终为falseless的值为 \(\text{reference} < \text{test}\)equal的值为 \(\text{reference} = \text{test}\)lessequal的值为 \(\text{reference} \leq \text{test}\)greater的值为 \(\text{reference} > \text{test}\)notequal的值为 \(\text{reference} \neq \text{test}\)greaterequal的值为 \(\text{reference} \geq \text{test}\)always的值始终为true
stencil_ref – 指定模版测试的参考值。有效值: 有效值: int, 箝位在 [0, 255] 范围内。
stencil_pass – 指定对通过模版和深度测试的样本执行的操作。
stencil_fail – 指定对模版测试失败的样本执行的操作。
stencil_zfail – 指定对通过模版测试但未通过深度测试的样本执行的操作。
有效操作:
keep– 保持当前值。zero– 设置数值为0.replace– 将数值设置为引用的stencil_ref值incrsat– 增加当前值并箝位到[0, 255].decrsat– 递减当前值并箝位到[0, 255].incr– 增加当前值,当超过最大值时,包转到0.decr– 递减当前值,当值低于0``时,将最大值包络到 ``255。
示例:
stencil = true;
stencil_func = always;
stencil_pass = replace;
stencil_ref = 255;
stencil_zfail = keep;
stencil_fail = keep;
剔除
cull_mode 指定剔除模式。
ccw– 逆时针。cw– 顺时针。none– 不进行剔除。
默认值为 ccw。
示例:
cull_mode = cw;
Alpha到覆盖范围
Alpha 到覆盖 (A2C) 将像素着色器的 Alpha 输出值映射到 MSAA 映射到 MSAA 的覆盖掩码。 该功能可能有助于平滑经过 Alpha 测试的纹理(如植被)边缘。
例如,在启用 4x MSAA 和 A2C 的情况下,如果一个像素的输出 Alpha 值为 0.5,那么在 4 个覆盖样本中只有 2 个样本的 Alpha 值为 0.5、 则 4 个覆盖样本中只有 2 个会存储颜色。
可以通过将 alpha_too_coverage 设置为 true / ``false``来切换。
视图实例
视图实例化功能允许在一次绘制调用中多次运行着色器,以绘制不同的视图实例。
为着色器提供的 SV_ViewID 语义定义了视图实例的索引。
该功能仅在 DX12 上支持,并强制执行着色器模型 6.1 编译。
视图实例的最大数量由 MAX_VIEW_INSTANCES = 4 定义。
例如,使用视图实例化功能,可以在 2 次渲染中为点光源捕捉立方体阴影贴图,每次渲染有 3 个视图实例。
有效语法为 view_instances = 1..4。
view_instances = 1 表示一个实例(默认情况)。
颜色书写掩码
颜色写入掩码可通过 color_write 状态变量进行配置。
您可以通过 RGBA swizzle 或 int 数字(在 [0, 15] 范围内)设置掩码。
因此, r = 0b0001, g = 0b0010, b = 0b0100, a = 0b1000。
例如:
color_write = rg;
// color_write = 3 相同
// 3 = 0b0011 = rg
颜色遮罩支持多个渲染目标,即每个渲染目标的遮罩可以不同。
您可以使用 [] 操作符为特定的渲染目标指定遮罩。
color_write = true; // 为所有 RT 设置 RGBA
color_write[1] = rg; // 为 RT[1] 设置 RG
默认情况下,所有渲染目标的颜色掩码都是 RGBA。