¿Cómo puedo declarar la versión de OpenGL en shaders en Android?

Estoy experimentando con OpenGL ES 3.0 y encontré la siguiente declaración en la hoja de referencia rápida:

"#version 300 es" debe aparecer en la primera línea de un programa de shader escrito en GLSL ES versión 3.00. Si se omite, el sombreado se tratará como la versión de orientación 1.00.

Así que traté de añadir esto al principio de mis shaders, pero que sólo resultó en el error

Se produjo un error en el enlace debido a un sombreado de vértices no válido.

Según lo informado por .glGetProgramInfoLog . Si quito la primera línea con la instrucción "#version 300 gl", el shader compila y funciona.

Este es el código de mi vertex shader

 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"; 

También agregué la instrucción de versión al vértice y el fragmento shader, y todavía consigo el mismo error.

Llamo a setEGLContextClientVersion(3) en mi GLSurfaceView, y he añadido <uses-feature android:glEsVersion="0x00030000" android:required="true" /> a mi manifiesto para indicar que la aplicación requiere OpenGL ES 3.0.

¿Estoy leyendo la documentación de OpenGL ES mal y no necesito agregar esta declaración de versión? Si necesito agregarlo, ¿qué estoy haciendo mal que siempre da lugar a un error?

Al leer la especificación GLSL ES3.0 se enumeran "atributo" y "variable" como palabras clave reservadas que resultarán en un error.

En GLES3, debe calificar las variables de entrada con "in" y las variables de salida con "out".

Así que en el sombreador de vértices,

 attribute -> in varying -> out 

Y en el fragmento shader

 varying -> in 

Sección 4.3 en la especificación (calificadores de almacenamiento) tiene todos los detalles.

  • ¿Por qué no hay un método onSurfaceDestroyed en GLSurfaceView.Renderer?
  • La manera más eficiente de dibujar objetos idénticos múltiples?
  • Texturas que sólo se muestran en algunos dispositivos
  • ¿Es mejor usar GL_FIXED o GL_FLOAT en Android
  • Android: actualiza el mapa de bits del hilo del temporizador
  • Cómo hacer una cámara personalizada con Live Stickers
  • Cómo crear el modelo de cara de usuario dinámico en android?
  • Cómo cargar recursos o activos en GLWallpaper service
  • Máscara Libgdx con imagen
  • La GPU del emulador no funciona
  • Mal rendimiento de Android Canvas.drawBitmap - cambiar a OpenGL?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.