Как да декларирам версията на 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