我有一个着色器函数,其功能类似于 Blender3D 中的“色带”节点。它将一个介于 0 和 1 之间的浮点数作为输入,并输出一种颜色,该颜色是按指定顺序混合了任意数量的颜色:
这是我的代码:
fixed4 ColorRamp(float factor){
float positions[5] = {_Pos0, _Pos1, _Pos2, _Pos3, _Pos4};
fixed4 colors[5] = {_Color0, _Color1, _Color2, _Color3, _Color4};
fixed4 outColor = _Color0;
for(int i = 0; i <4; i++){
if(factor >= positions[i] && factor <positions[i+1]){
fixed localFactor = (factor - positions[i])/(positions[i+1] - positions[i]);
outColor = lerp(colors[i], colors[i+1], localFactor);
}else if (factor > positions [_NumColors-1]){
outColor = colors[_NumColors -1];
}
}
return outColor;
}
有用。但它很糟糕,有几个原因:
- 渐变中的颜色数量是硬编码的。在 Unity 编辑器中添加它们的列表会好得多。
- if/else 语句。我知道这些对性能很糟糕,应该避免。
- 颜色数组在函数中声明,这意味着必须为每个片段创建一个新数组(我认为)。
我的主要问题是第一个问题:如何在无需编辑硬编码值的情况下更改渐变中的颜色数量?