如何用 替换 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
你在这里看到的任何东西
我正在移植一个自定义着色器以使其在手机上运行,因为手机内部的着色器不能有 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
你在这里看到的任何东西