GLSL<> vec4上的运营商

时间:2011-05-02 17:02:42

标签: opengl glsl

我正在查看一些较新的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

1 个答案:

答案 0 :(得分:10)

spec,第5.9节(第38页上方):

  

关系运算符大于   (&gt;),小于(&lt;),大于或   等于(&gt; =),小于等于   (&lt; =)仅在标量整数上运行   和标量浮点表达式。   结果是标量布尔值。或   操作数的类型必须匹配,或者   第4.1.10节中的转换   将采用“隐含转换”   到整数操作数,之后   类型必须匹配。去做   分量关系比较   在矢量上,使用内置函数   lessThan,lessThanEqual,greaterThan,   和greaterThanEqual。

看起来你想要 lessThan 功能。检查第8.6节(第62页)。