我正在查看一些较新的GLSL代码,这些代码无法编译到我当前的OpenGL版本中,我想知道以下简短形式的含义:
vec4 base;
if (base < 0.5) {
result = (2.0 * base * blend);
}
这相当于:
if (base.r < 0.5 && base.g < 0.5 && base.b < 0.5 && base.a < 0.5) {
result.r = 2.0 * base.r * blend.r;
result.g = 2.0 * base.g * blend.g;
result.b = 2.0 * base.b * blend.b;
result.a = 2.0 * base.a * blend.a;
}
编辑:
Error:
Fragment shader failed to compile with the following errors:
Wrong operand types no operation '<' exists that takes a left-hand operand of type 'highp 3-component vector of float' and a right operand of type 'const float' (or there is no acceptable conversion)
我也试过了:
(base.rgb < vec3(0.5))
... Wrong operand types no operation '<' exists that takes a left-hand operand of type 'highp 3-component vector of float' and a right operand of type 'const highp 3-component vector of float'
我假设这是因为我使用的是GLSL 1.2。 ATI Radeon 3450
答案 0 :(得分:10)
从spec,第5.9节(第38页上方):
关系运算符大于 (&gt;),小于(&lt;),大于或 等于(&gt; =),小于等于 (&lt; =)仅在标量整数上运行 和标量浮点表达式。 结果是标量布尔值。或 操作数的类型必须匹配,或者 第4.1.10节中的转换 将采用“隐含转换” 到整数操作数,之后 类型必须匹配。去做 分量关系比较 在矢量上,使用内置函数 lessThan,lessThanEqual,greaterThan, 和greaterThanEqual。
看起来你想要 lessThan 功能。检查第8.6节(第62页)。