着色器 - 颜色混合

时间:2015-04-27 20:30:23

标签: opengl directx glsl shader hlsl

我想知道如何以特定方式混合颜色。

让我们假设我有一种颜色(A)和另一种颜色(B)

我想以这样的方式混合它们:如果我为(B)选择白色,那么输出颜色是(A)但是如果有任何其他颜色(B)的颜色会输出(A)(B)的混合。

  • 我尝试了添加,但没有给出预期的结果。
  • 我尝试过乘法混合,对于(B)白色值非常好但是蓝色(B)和红色(A )颜色。

知道怎么做吗?

2 个答案:

答案 0 :(得分:2)

使用GLSL,最简单的方法可能是使用分支。如果colAcolB是两个向量(类型为vec4),保持您的颜色 A B

if (any(lessThan(colB.xyz, vec3(1.0)))) {
    outColor = colB;
} else {
    outColor = colA;
}

或者,如果你真的想避开分支,你可以更多地依赖内置函数。例如,使用观察结果,如果所有组件都在[0.0,1.0]范围内,则向量与自身的点积对于向量(1.0,1.0,1.0)为3.0,对于所有其他向量则为小:

outColor = mix(colB, colA, step(3.0, dot(colB.xyz, colB.xyz)))

您必须进行基准测试才能找出哪些更快。

对于上述两种变化的比较,可能存在对浮点精度的担忧。我认为应该没问题,因为1.0可以完全表示为浮点数。但是如果你遇到问题,你可能希望通过将colB与较小值相比较的常数更改为略微更小的值来允许一些不精确。

答案 1 :(得分:1)

为了避免shader中的分支,一种技术是使用lerp(linear interpolation)。也就是说,使用可能的条件变量作为lerp因子,因此如果它是0它是one颜色,如果它是1它是other颜色。

确保反转逻辑,因为第二个参数是它与cond=1混合的内容。这也允许你混合一半。

示例:

而不是

Color result = (cond)? A:B;

使用:

Color result=lerp(cond,B,A);