2015-07-17 3 views
0

Я пишу GLSL-шейдер, используя директиву препроцессора #if, но я всегда получаю ошибку incorrect preprocessor directive.Неправильная ошибка директивы препроцессора оператора IF

Вот мой код ниже (только соответствующая часть):

#define thre 20 
float s = get_sample_data(sampling_pos); 
#if s > thre 
vec4 val = texture(transfer_texture, vec2(s, s)); 
#endif 
+1

Я думаю, что вы пытаетесь использовать препроцессор для чего-то, что должно быть сделано с помощью регулярного if(). Значение переменной s не может быть видно препроцессором, ваш код должен быть, если (s> thre) {vec4 val = texture (transfer ......)); } – BrunoLevy

ответ

2

Препроцессирование является одним из шагов компиляции, которая происходит до выполнения. Он просто преобразует источник, основываясь на найденных линиях #. Он не имеет понятия о переменной, которая представляет собой концепции времени исполнения. В это время переменная не имеет значений, и препроцессор даже не знает их.

Зная, что тривиально утверждать, что вы не можете использовать значение переменной в директиве препроцессора.

Вы можете сравнить значение с помощью #define буквальной константы:

#define thre 12 
#if thre > 15 
    float x = 1.; 
#else 
    float x = -1.; 
#endif 

В GLSL, вы все еще можете использовать conditionnal структуру, но это только «правильное», если.

if(s>thre){ 
    // do something 
}else{ 
    // do something else 
} 
+1

Большое вам спасибо ~ Ваше объяснение очень ясно. – angella1011

Смежные вопросы