【问题标题】:Need some clarification with "blending" in direct3d 11需要对direct3d 11中的“混合”进行一些澄清
【发布时间】:2015-07-29 00:59:40
【问题描述】:

我通过谷歌搜索并找到了解释混合在 direct3d 11 中如何工作的结果。所以我发布这篇文章只是为了验证我是否完全理解这些概念。

在大多数情况下,我对混合的概念有所了解。我们通过组合两种颜色并产生最终颜色来混合颜色。这主要是通过 direct3d 在输出合并阶段的两个方程来完成的。

FinalColor = (Source Color * Source Blend Factor) + (Destination Color * Destination Blend Factor)

FinalAlpha = (Source Alpha * Source Alpha Blend Factor) + (Destination Alpha * Destination Alpha Blend Factor)

颜色源Source ColorSource Alpha 由像素着色器输出的任何内容定义。并且目的地 Destination ColorDestination Alpha 由渲染目标(后缓冲区)中的任何颜色定义。

现在,我有点难以理解混合因子 Source Blend FactorDestination Blend FactorSource Alpha Blend FactorDestination Alpha Blend factor

因为我知道这些混合因子是由 D3D11_RENDER_TARGET_BLEND_DESC 定义的,所以我可以使用成员 SrcBlend 并为其指定标志 D3D11_BLEND_SRC_COLOR... 这意味着混合因子 Source Blend Factor 将具有颜色像素着色器输出。

那么你认为我理解混合的概念吗?还是我缺少什么? (欢迎指正)

【问题讨论】:

    标签: c++ direct3d direct3d11


    【解决方案1】:

    混合方程比你上面写的更灵活。通用混合方程为:

    DestColor = Color1 <ColorOp> Color2
    DestAlpha = Alpha1 <AlphaOp> Alpha2
    

    虽然Color1 通常是像素着色器的输出,但它(连同Color2Alpha1Alpha2)可以是BLEND 枚举中的任何值。同样,虽然混合运算符通常是 +,但它实际上可以是 BLEND_OP 枚举中的任何值。这些一起提供了所有可能的标准化线性混合操作的完整集合。有关“传统 alpha 混合”使用哪些值的示例,请参阅 this answer

    【讨论】:

    • 感谢您的回复和链接。但是我还有一个问题(这个问题可能很傻,但我想确保我理解这一点),通过填写结构D3D11_RENDER_TARGET_BLEND_DESC...我只是在描述混合方程实际上看起来是正确的吗?
    • @Soon_to_be_code_master 正确 - 当您填写结构成员时,然后在调用 CreateBlendState 时使用它们(作为 D3D11_BLEND_DESC 的成员),您最终会得到一个混合状态对象表示您根据结构描述的方程式。当您使用 OMSetBlendState 应用此混合状态时,GPU 将在后续绘制调用中使用该等式进行混合。
    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多