CG着色器 如何在3种不同比例的颜色之间进行插值?



我想通过根据模型世界 Y 位置和颜色的关键高度在 3 种颜色之间进行间极化来获取像素颜色。我可以使用 if 语句,但这在着色器编码中是不行的。

float _HeightMiddle = 10.0; //color = c0 at y=0 to c1 at y=10
float _HeightMax = 200.0;   //color = c1 at y=10 to c2 at y=200

fixed4 frag (v2f i) : SV_Target {  
fixed4 c0 = fixed4(0.4, 0.4, 0.4, 1);
fixed4 c1 = fixed4(0, 1, 1, 0.8);
fixed4 c2 = fixed4(0, 1, 1, 0.2);
fixed4 col = lerp(c0, lerp(c1, c2, i.worldPos.y / 200), i.worldPos.y / 10);
return col;
}

但这给出了错误的颜色(使用上面的颜色,地面上的像素又名 c0 是红色而不是 mig 灰色(。

此外,着色器在使用变量时会产生不同的结果,因此我对它们进行了硬编码。

我的建议是使用三元运算符,老实说,它应该编译为与 if 大致相同的内容......否则,但在风格上提升每次运行着色器代码的执行时间相同。另一种思考方式,如果...else 语句不会弄乱你的着色器,除非你在其分支之一中发生了额外的执行。有关详细信息,请参阅此处接受的答案 - 条件语句会减慢着色器的速度吗?

所以你可以运行这样的代码...

fixed4 col = (y < _HeightMiddle) ? 
lerp(...for your first range...) : lerp(...for your second rage...)

抱歉,不打算努力写出一个完整的正确示例。你听起来好像没有它你会很快接受这个概念。

最新更新