.. _pipeline-states: ============================ 管线状态配置 ============================ DSHL 有一些状态变量,用于配置固定的流水线阶段(混合、深度/模版测试等)。 您可以选择在着色器中定义它们。 -------- 混合 -------- 可使用以下语法在 DSHL 着色器中配置混合设置: .. code-block:: c blend_target = blend_factor; 其中 ``blend_target`` 是这些状态变量之一 - ``blend_src`` - 混合源 - ``blend_dst`` -- 混合目的地 - ``blend_asrc`` -- 混合阿尔法源 - ``blend_adst`` -- 混合 alpha 目的地 和 ``blend_factor`` 是这些关键字之一: +-------------------+---------------------------+----------------------------------+--------------------+ | 关键字 | 说明 | RGB 混合因子 | Alpha 混合因子 | +===================+===========================+==================================+====================+ | ``zero`` or ``0`` | Zero | (0, 0, 0) | 0 | +-------------------+---------------------------+----------------------------------+--------------------+ | ``one`` or ``1`` | One | (1, 1, 1) | 1 | +-------------------+---------------------------+----------------------------------+--------------------+ | ``sc`` | Source Color | (R_s, G_s, B_s) | A_s | +-------------------+---------------------------+----------------------------------+--------------------+ | ``isc`` | Inverse Source Color | (1 - R_s, 1 - G_s, 1 - B_s) | 1 - A_s | +-------------------+---------------------------+----------------------------------+--------------------+ | ``sa`` | Source Alpha | (A_s, A_s, A_s) | A_s | +-------------------+---------------------------+----------------------------------+--------------------+ | ``isa`` | Inverse Source Alpha | (1 - A_s, 1 - A_s, 1 - A_s) | 1 - A_s | +-------------------+---------------------------+----------------------------------+--------------------+ | ``dc`` | Destination Color | (R_d, G_d, B_d) | A_d | +-------------------+---------------------------+----------------------------------+--------------------+ | ``idc`` | Inverse Destination Color | (1 - R_d, 1 - G_d, 1 - B_d) | 1 - A_d | +-------------------+---------------------------+----------------------------------+--------------------+ | ``da`` | Destination Alpha | (A_d, A_d, A_d) | A_d | +-------------------+---------------------------+----------------------------------+--------------------+ | ``ida`` | Inverse Destination Alpha | (1 - A_d, 1 - A_d, 1 - A_d) | 1 - A_d | +-------------------+---------------------------+----------------------------------+--------------------+ | ``sasat`` | Source Alpha Saturation | (f, f, f); f = min(A_s, 1 - A_d) | 1 | +-------------------+---------------------------+----------------------------------+--------------------+ | ``bf`` | Blend Constant | (R_c, G_c, B_c) | A_c | +-------------------+---------------------------+----------------------------------+--------------------+ | ``ibf`` | Inverse Blend Constant | (1 - R_c, 1 - G_c, 1 - B_c) | 1 - A_c | +-------------------+---------------------------+----------------------------------+--------------------+ 其中 - ``(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``代表可配置的混合常数 混合使用以下伪代码执行: .. code-block:: c if (blendEnable) { finalColor.rgb = (srcColorBlendFactor * srcColor.rgb) (dstColorBlendFactor * dstColor.rgb); finalColor.a = (srcAlphaBlendFactor * srcColor.a) (dstAlphaBlendFactor * dstCoilor.a); } else { finalColor = srcColor; } finalColor = finalColor & colorWriteMask; 示例: .. code-block:: c blend_src = sa; blend_dst = 1; blend_asrc = sa; blend_adst = 1; .. warning:: 混合**操作**(以及 ``bf`` 和 ``ibf`` 混合模式的混合常数)需要在 C++ 代码中配置。 如果不在着色器中配置混合因子,则将使用这些默认值: .. code-block:: c blend_src = 1; blend_dst = 0; blend_asrc = 1; blend_adst = 0; **独立混合** Dagor 支持独立混合,即不同的渲染目标可以有不同的混合设置。 这可以通过使用 ``[]`` 操作符为 ``blend_src, blend_dst, blend_asrc, blend_adst`` 变量提供索引来实现。 .. code-block:: c 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的值为 :math:`\text{reference} = \text{test}` - ``notequal`` 的值为 :math:`\text{reference} \neq \text{test}` - ``always`` 的值始终为 ``true`` 默认值是 ``GREATER_OR_EQUAL``(求值为 :math:`\text{reference} \geq \text{test}`)。 请注意,这个值不能显式设置,因为它是默认行为、 因为达戈遵循的惯例是,**接近**的对象具有**更多**深度值。 示例: .. code-block:: c z_write = false; z_test = true; z_func = always; **模板状态变量*** ``stencil`` -- 启用/禁用模版测试。有效值: ``true`` / ``false``。默认值: ``false``. ``stencil_func`` -- 指定模版测试的比较函数。有效值: - ``never`` 的值始终为 ``false`` - ``less`` 的值为 :math:`\text{reference} < \text{test}` - ``equal`` 的值为 :math:`\text{reference} = \text{test}` - ``lessequal`` 的值为 :math:`\text{reference} \leq \text{test}` - ``greater`` 的值为 :math:`\text{reference} > \text{test}` - ``notequal`` 的值为 :math:`\text{reference} \neq \text{test}` - ``greaterequal`` 的值为 :math:`\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``。 示例: .. code-block:: c stencil = true; stencil_func = always; stencil_pass = replace; stencil_ref = 255; stencil_zfail = keep; stencil_fail = keep; ------- 剔除 ------- ``cull_mode`` 指定剔除模式。 - ``ccw`` -- 逆时针。 - ``cw`` -- 顺时针。 - ``none`` -- 不进行剔除。 默认值为 ``ccw``。 示例: .. code-block:: c 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-mask: ---------------- 颜色书写掩码 ---------------- 颜色写入掩码可通过 ``color_write`` 状态变量进行配置。 您可以通过 RGBA swizzle 或 ``int`` 数字(在 ``[0, 15]`` 范围内)设置掩码。 因此, ``r = 0b0001``, ``g = 0b0010``, ``b = 0b0100``, ``a = 0b1000``。 例如: .. code-block:: c color_write = rg; // color_write = 3 相同 // 3 = 0b0011 = rg 颜色遮罩支持多个渲染目标,即每个渲染目标的遮罩可以不同。 您可以使用 ``[]`` 操作符为特定的渲染目标指定遮罩。 .. code-block:: c color_write = true; // 为所有 RT 设置 RGBA color_write[1] = rg; // 为 RT[1] 设置 RG 默认情况下,所有渲染目标的颜色掩码都是 RGBA。