Можно ли определить, является ли версия OpenGL OpenGL ES в коде шейдера? - PullRequest
6 голосов
/ 01 декабря 2011

Есть ли способ указать в исходном коде шейдера, что шейдер компилируется для OpenGL ES?Я хочу иметь возможность определить версию, используя директиву препроцессора #version, равную 100 для OpenGL ES (так что шейдер компилируется для OpenGL ES 2.0), но версия 110 для OpenGL 2.1).

Isлучший способ сделать это, чтобы поместить #version как отдельную строку, которая подается на уровне приложения, или есть способ сделать это в шейдере?

Еще одна полезная, связанная с этим вещьв состоянии сделать, это сказать что-то вроде #if version == 100 скомпилировать этот код, else скомпилировать этот код.Возможно ли это в GLSL?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Добавление #version из основной программы, как предложил PeterT в приведенном выше комментарии, - это способ only , который будет работать. Способность сделать это (и способность определять константы без наличия чего-то вроде -D доступного переключателя компилятора) является основным намерением, стоящим за glShaderSource взятием массива указателей, а не простого char*.

Спецификация GLSL (глава 3.3) требует, чтобы #version был первым в источнике шейдера, за исключением пробелов и комментариев.

Таким образом, нет такой вещи, как

#ifdef foo
    #version 123
#endif

допустимо, и никакие такие вещи не будут компилироваться (если только компилятор шейдера не является чрезмерно разрешающим, то есть неработающим).

Что касается вашего второго вопроса, то условная компиляция, безусловно, работает, и использовать ее так, как вы намереваетесь, - хорошая вещь.

4 голосов
/ 01 июля 2013

Это также связанная информация:

http://blog.beuc.net/posts/OpenGL_ES_2.0_using_Android_NDK/

Например, вы можете:

#ifdef GL_ES
    precision mediump float;
#endif

В реализациях OpenGL ES 2.0 требуется наличие макроса GL_ESпредопределено в шейдерах.

...