管线状态配置

DSHL 有一些状态变量,用于配置固定的流水线阶段(混合、深度/模版测试等)。 您可以选择在着色器中定义它们。

混合

可使用以下语法在 DSHL 着色器中配置混合设置:

blend_target = blend_factor;

其中 blend_target 是这些状态变量之一

  • blend_src - 混合源

  • blend_dst – 混合目的地

  • blend_asrc – 混合阿尔法源

  • blend_adst – 混合 alpha 目的地

blend_factor 是这些关键字之一:

其中

  • ``(R_s, G_s, B_s)``和 ``A_s``代表源的 R、G、B、A 分量(着色器刚刚生成的新值)

  • (R_d, G_d, B_d)``和 ``A_d 代表目标(当前渲染目标中的旧值)的 R、G、B、A 分量

  • ``(R_c, G_c, B_c)``和 ``A_c``代表可配置的混合常数

混合使用以下伪代码执行:

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

混合**操作**(以及 bfibf 混合模式的混合常数)需要在 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 – 指定用于深度测试的比较功能。有效值:

  • equal e的值为 \(\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 的值始终为 false

  • less 的值为 \(\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 = 0b0001g = 0b0010b = 0b0100a = 0b1000

例如:

color_write = rg;
// color_write = 3 相同
// 3 = 0b0011 = rg

颜色遮罩支持多个渲染目标,即每个渲染目标的遮罩可以不同。 您可以使用 [] 操作符为特定的渲染目标指定遮罩。

color_write = true; // 为所有 RT 设置 RGBA
color_write[1] = rg; // 为 RT[1] 设置 RG

默认情况下,所有渲染目标的颜色掩码都是 RGBA。