如何将if语句替换为?使着色器在移动设备上工作的操作员



我正在移植一个自定义着色器,使其在手机上工作,因为手机内部的着色器不能有if语句。

我尝试用?运算符替换代码中的if语句,但我无法在Unity中编译而不出错。我对c#还很陌生,所以很明显我在这里缺少了一些东西来完成这项工作。这里更有经验的程序员有什么建议吗?非常感谢大家。

//对原始代码进行了注释。

我还试图将结果存储在一个变量中并返回,但也没有成功。

/*  
if (charCol.r > .8f) 
{
if(_monochromatic == 1)
return float4(0, gray, 0, 1);
else
return col;
}
else 
{
return col * _brightness;
}   
*/
charCol.r > .8f ? (_monochromatic == 1) ? return float4(0, gray, 0, 1) : return col : return col * _brightness;

错误消息:

"自定义/着色器"中的着色器错误:语法错误:意外的令牌"return">

您应该按如下方式return

return charCol.r > .8f 
? ((_monochromatic == 1) ? float4(0, gray, 0, 1) : col) 
: col * _brightness;

小观点:

即使您可以使用三元运算符返回值,如果逻辑复杂且难以维护,您也可能会感到头疼。

三元运算符运行测试,如果测试为真,则解析为一个值;如果测试为假,则解析另一个值

var age = person.Age > 21 : "adult" : "child";

测试年龄,选择其中一个值,表达式作为一个整体解析为某个字符串,age就是一个字符串。因为整个东西实际上是一个值,所以可以返回

你可能会忍不住要把这些放在窝里;这是可能的,但我会说";只有在简单的情况下才这样做";类似:

var age = person.Age > 21 : "adult" : (person.Age > 12 ? "teenager" : "child");

如果你想更进一步,这很快就会陷入混乱。相反,更喜欢切换表达式:

var age = person.Age switch {
>21 => "adult",
>12 => "teenager",
_ => "child"
};

你可以通过想象编译器在每一行前面加上切换之前的东西来阅读这篇文章,=>就像";那么";并且CCD_ 5类似于"0";否则":

var age = switch {
person.Age>21 then "adult",
person.Age>12 then "teenager",
else then "child"
};

当然,对于任何解析为值的东西,在返回之前都不必将其存储在变量中。你可以在上用var age =替换return

最新更新