Как объявить версию OpenGL в шейдерах на Android?

Я экспериментирую с OpenGL ES 3.0 и обнаружил в кратком справочнике следующее утверждение:

«#Version 300 es» должно стоять в первой строке программы шейдера, написанной на GLSL ES версии 3.00. Если этот параметр не указан, шейдер будет рассматриваться как версия 1.00 для таргетинга.

Поэтому я попытался добавить это в начало моих шейдеров, но это привело только к ошибке.

Ошибка связи из-за недопустимого вершинного шейдера.

как сообщает .glGetProgramInfoLog. Если я удалю первую строку с оператором "#version 300 gl", шейдер компилируется и работает.

Это код моего вершинного шейдера

private final String vertexShaderCode =
        "#version 300 es \n" +
        "uniform mat4 uMVPMatrix; \n" +
        "attribute vec2 a_TexCoordinate; \n" +
        "attribute vec4 vPosition; \n" +
        "varying vec2 v_TexCoordinate; \n" +
        "void main() { \n" +
        "  v_TexCoordinate = a_TexCoordinate; \n" +
        "  gl_Position = uMVPMatrix * vPosition; \n" +
        "} \n";

Я также добавил оператор версии к вершине и шейдеру фрагмента, и все равно получаю ту же ошибку.

Я вызываю setEGLContextClientVersion(3) в моем GLSurfaceView и добавляю <uses-feature android:glEsVersion="0x00030000" android:required="true" /> в свой манифест, чтобы указать, что приложению требуется OpenGL ES 3.0.

Я неправильно читаю документацию OpenGL ES, и мне не нужно добавлять этот оператор версии? Если мне нужно добавить его, что я делаю не так, что это всегда приводит к ошибке?


person Mad Scientist    schedule 07.09.2013    source источник
comment
Полезный совет: используйте glGetShaderInfoLog, чтобы получить более подробную информацию об ошибках компиляции шейдера.   -  person Arttu Peltonen    schedule 12.09.2013


Ответы (1)


При чтении спецификации GLSL ES3.0 перечисляется атрибут " "и" варьируются как зарезервированные ключевые слова, что приведет к ошибке.

В GLES3 вы должны квалифицировать входные переменные с помощью «in» и выходные переменные с «out».

Итак, в вершинном шейдере

attribute -> in
varying   -> out

И во фрагментном шейдере

varying -> in

В разделе 4.3 спецификации (квалификаторы хранилища) есть все подробности.

person umlum    schedule 07.09.2013