如何用 替换 if 语句?使着色器在移动设备上工作的运营商?

How do I replace if statements with ? operator for making a shader work on mobile?

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

我尝试用 ? 运算符替换代码的 if 语句,但我无法在 Unity 中正确编译。我是 c# 的新手,所以很明显我在这里缺少一些东西来完成这个。 这里有更多经验丰富的程序员的建议吗?非常感谢大家。

// 原代码有注释

我也尝试过将结果存储在一个变量中 return 但还是没用。

/*  
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;

错误信息:

Shader error in 'Custom/Shader': syntax error: unexpected token 'return'

您应该return如下:

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

小意见:

即使你可以return值三元运算符,如果逻辑复杂且难以维护,你可能会头疼。

三元运算符运行测试并在测试为真时解析为一个值,在测试为假时解析为另一个值

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

测试年龄,选择其中一个值,整个表达式解析为某个字符串,age 这是一个字符串。因为整个事物实际上是一个值,所以它可以 returned

您可能想嵌套这些;这是可能的,但我会说“只有在简单的情况下才这样做”,例如:

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

如果你想更进一步,这很快就会变得一团糟。相反更喜欢 switch 表达式:

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

你可以通过想象编译器在每一行前面加上 switch 之前的东西来阅读这篇文章,=> 就像“then”,_ 就像“else”:

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

当然,对于解析为值的任何内容,您不必在 return 之前将其存储在变量中.. 您可以将 var age = 换成 return你在这里看到的任何东西