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