Я экспериментировал с 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 неправильно и мне не нужно добавлять эту инструкцию? Если мне нужно добавить его, что я делаю неправильно, это всегда приводит к ошибке?
Полезный совет: используйте glGetShaderInfoLog, чтобы получить более подробные ошибки компиляции шейдеров. –