我想知道如何以特定方式混合颜色。
让我们假设我有一种颜色(A)和另一种颜色(B)。
我想以这样的方式混合它们:如果我为(B)选择白色,那么输出颜色是(A)但是如果有任何其他颜色(B)的颜色会输出(A)和(B)的混合。
知道怎么做吗?
答案 0 :(得分:2)
使用GLSL,最简单的方法可能是使用分支。如果colA
和colB
是两个向量(类型为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);