Сравнение двух целых чисел в GLSL - PullRequest
1 голос
/ 30 мая 2019

Я хочу построить фрагментный шейдер, и я понял, что сравнение между двумя int в glsl 1.5.0 всегда возвращает false. Я использую целые числа в качестве перечисления в параметре метода. Это простая проблема, и этот код имеет тот же результат.

void main(){
    int x = 5;
    #if(x == 5)
        gl_FragColor = vec4(1.0);
    #else
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    #endif
}

Я попробовал этот код, и условие x == int(2) всегда вернет true!

void main(){
    int x = 5;
    #if(x == int(2))
        gl_FragColor = vec4(1.0);
    #else
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    #endif
}

Итак, что мне делать, чтобы правильно сравнить два целых числа?

1 Ответ

2 голосов
/ 30 мая 2019

#if, #else и #endif - операторы препроцессора. Но int x = 5; является локальной переменной. Препроцессор обрабатывает исходную строку, она является частью процесса объединения, но это делается до фактической компиляции. Переменная x не имеет значения для препроцессора.

A x для препроцессора можно определить следующим образом:

#define x 5

#if(x == 5)
        gl_FragColor = vec4(1.0);
#else
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
#endif

Но оператор glsl if начинается с ключевого слова if, за которым следует выражение bool и выражение. Необязательно, за ним следует ключевое слово else и еще одно утверждение:

int x = 5;
if (x == 5)
{
    gl_FragColor = vec4(1.0);
}
else
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

В этом случае фигурные скобки можно пропустить, потому что в каждом случае есть только одно утверждение.

Обратите внимание, также может использоваться троичный оператор:

gl_FragColor = x==5 ? vec4(1.0) : vec4(1.0, 0.0, 0.0, 1.0);

Все это можно подробно прочитать в спецификации OpenGL Shading Language 1.50 . Препроцессор описан в главе «3.3. Препроцессор», оператор if указан в главе «6.2 Выбор», а троичный оператор - в главе «5.8 Назначения»

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