1

我正在移植一个自定义着色器以使其在手机上工作,因为手机内的着色器不能有 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;

错误信息:

“自定义/着色器”中的着色器错误:语法错误:意外令牌“返回”

4

2 回答 2

2

你应该return如下:

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

小意见:

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

于 2022-02-08T04:47:39.483 回答
1

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

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

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

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

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

如果您尝试更进一步,这会迅速陷入混乱。而是更喜欢 switch 表达式:

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

您可以通过想象编译器在每一行加上切换之前的东西来阅读这个,=>就像“then”和_“else”:

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

当然,对于任何解析为值的内容,您不必在返回之前将其存储在变量中。您可以交换您在此处看到的任何var age =内容return

于 2022-02-08T06:40:21.980 回答