Добавление #version
из основной программы, как предложил PeterT в приведенном выше комментарии, - это способ only , который будет работать. Способность сделать это (и способность определять константы без наличия чего-то вроде -D
доступного переключателя компилятора) является основным намерением, стоящим за glShaderSource
взятием массива указателей, а не простого char*
.
Спецификация GLSL (глава 3.3) требует, чтобы #version
был первым в источнике шейдера, за исключением пробелов и комментариев.
Таким образом, нет такой вещи, как
#ifdef foo
#version 123
#endif
допустимо, и никакие такие вещи не будут компилироваться (если только компилятор шейдера не является чрезмерно разрешающим, то есть неработающим).
Что касается вашего второго вопроса, то условная компиляция, безусловно, работает, и использовать ее так, как вы намереваетесь, - хорошая вещь.