GLSL <> операторы на vec4 - PullRequest
10 голосов
/ 02 мая 2011

Я смотрю на более новый код 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;
}

Edit:

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 Ответ

10 голосов
/ 02 мая 2011

Из spec , раздел 5.9 (вверху страницы 38):

Реляционные операторы больше (>), меньше (<), больше или равно(> =) и меньше или равно (<=) работают только со скалярными целочисленными и скалярными выражениями с плавающей точкой.Результат скалярный логический.Либо типы операндов должны совпадать, либо преобразования из Раздела 4.1.10 «Неявные преобразования» будут применены к целочисленному операнду, после чего типы должны совпадать.Для компонентного реляционного сравнения векторов используйте встроенные функции lessThan, lessThanEqual, большееThan и moreThanEqual. </p>

Похоже, вам нужна функция lessThan .См. Раздел 8.6 (стр. 62).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...