2013-09-07 3 views
6

Я экспериментировал с OpenGL ES 3.0 и обнаружил следующее заявление в Кратком листе:Как объявить версию OpenGL в шейдерах на Android?

«#Version 300 эс» должен появиться в первой строке программы шейдера написан в 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 неправильно и мне не нужно добавлять эту инструкцию? Если мне нужно добавить его, что я делаю неправильно, это всегда приводит к ошибке?

+1

Полезный совет: используйте glGetShaderInfoLog, чтобы получить более подробные ошибки компиляции шейдеров. –

ответ

6

Считывая GLSL ES3.0 spec, он перечисляет «атрибут» и «переменный» в качестве зарезервированных ключевых слов, что приведет к ошибке.

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

Таким образом, в вершинном шейдере

attribute -> in 
varying -> out 

И в пиксельный шейдер

varying -> in 

Раздел 4.3 в спецификации (отборочные хранения) имеет все детали.

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