Error de procesamiento de instancia de OpenGL ES 3, pero funciona en escritorio

Puedo usar la representación de la instancia en el escritorio con el núcleo de GLSL 330 pero no puedo funcionar el mismo código de C ++ en Android (usando SDL2 y el sistema de la creación de NDK y el androide Studio).

El error logcat se muestra a continuación:

-18 15:49:57.264 20996-21026/package I/SDL/APP: shaders/mobile/sceneShader.frag.glsl compiled successfully 10-18 15:49:57.274 20996-21026/package I/SDL/APP: Program link failed: --From Vertex Shader: 10-18 15:49:57.274 20996-21026/packageI/SDL/APP: linker error: multiple attribute attempt to bind at same location 10-18 15:49:57.274 20996-21026/packageI/SDL/APP: --From Fragment Shader: 10-18 15:49:57.274 20996-21026/package I/SDL/APP: linker error: multiple attribute attempt to bind at same location 

Mis códigos de sombreado de escritorio y móviles son idénticos, excepto para la línea #version en la parte superior del archivo (especificando es o versiones de escritorio, respectivamente).

Mi código de sombreado móvil se muestra aquí:

 #version 300 es precision mediump float; // attribute data layout (location = 0) in vec3 VertexPosition; layout (location = 1) in vec2 VertexTexCoord; layout (location = 2) in vec3 VertexNormal; layout (location = 3) in mat4 InstanceTransform; // used for translating the positions of instance renders // varying data layout (location = 0) out vec3 vPosition; layout (location = 1) out vec2 vTexCoord0; layout (location = 2) out vec2 vTexCoord1; layout (location = 3) out vec3 vTexSkyboxCoord; layout (location = 4) out vec3 vNormal; layout (location = 5) out vec3 vClampColor; // uniform data layout (location = 0) uniform bool uInstanceRendering; layout (location = 1) uniform mat4 uModelViewMatrix; layout (location = 2) uniform mat4 uProjectionMatrix; layout (location = 3) uniform mat3 uNormalMatrix; layout (location = 4) uniform vec2 uTexOffset0; layout (location = 5) uniform vec2 uTexOffset1; void main(void) { vec4 mvPosition; if (uInstanceRendering) { mvPosition = uModelViewMatrix * InstanceTransform * vec4(VertexPosition, 1.0); } else { mvPosition = uModelViewMatrix * vec4(VertexPosition, 1.0); } vTexSkyboxCoord = VertexPosition; // for skybox rendering const float atlasRows = 6.0f; vTexCoord0 = (VertexTexCoord / atlasRows) + uTexOffset0; vTexCoord1 = (VertexTexCoord / atlasRows) + uTexOffset1; vPosition = mvPosition.xyz; vNormal = normalize(uNormalMatrix * VertexNormal); vClampColor = clamp(VertexPosition, 0.0, 1.0); gl_Position = uProjectionMatrix * mvPosition; #ifdef GL_ES gl_PointSize = 10.0f; #endif } 

Después de tediosamente el uso de comentarios tanto en el lado de C + + y lado GLSL he pin-señaló el error a esta línea de código:

 mvPosition = uModelViewMatrix * InstanceTransform * vec4(VertexPosition, 1.0); 

Si lo comento, el programa se compilará, pero no será capaz de realizar una llamada glDraw * Instaced sin toneladas de errores relacionados con gpu (mostrado abajo de logcat).

 10-18 15:58:42.504 29196-29238/package W/Adreno-GSL: <gsl_ldd_control:408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur 10-18 15:58:42.504 29196-29238/package W/Adreno-GSL: <log_gpu_snapshot:323>: panel.gpuSnapshotPath is not set.not generating user snapshot 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <gsl_ldd_control:408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <log_gpu_snapshot:323>: panel.gpuSnapshotPath is not set.not generating user snapshot 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <gsl_ldd_control:408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <log_gpu_snapshot:323>: panel.gpuSnapshotPath is not set.not generating user snapshot 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <gsl_ldd_control:408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <log_gpu_snapshot:323>: panel.gpuSnapshotPath is not set.not generating user snapshot 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <gsl_ldd_control:408>: ioctl fd 49 code 0xc02c093d (IOCTL_KGSL_SUBMIT_COMMANDS) failed: errno 35 Resource deadlock would occur 10-18 15:58:42.504 29196-29238/packageW/Adreno-GSL: <log_gpu_snapshot:323>: panel.gpuSnapshotPath is not set.not generating user snapshot 10-18 15:58:42.504 29196-29238/packageW/Adreno-ES20: <finish_current_fbo_rendering:315>: GL_OUT_OF_MEMORY 

Hice un ejemplo mínimo para probar simplemente la representación de la instancia y el mismo problema aparece con OpenGL ES 3 (también usando SDL todavía).

 #version 300 es precision mediump float; // attribute data layout (location = 0) in vec3 aVertexPosition; layout (location = 1) in vec2 aVertexTexCoord; layout (location = 2) in vec3 aVertexNormal; layout (location = 3) in mat4 aInstanceTransform; // varying data out vec3 vPosition; out vec2 vTexCoord; out vec3 vNormal; // uniform data uniform mat4 uModelViewMatrix; uniform mat4 uProjectionMatrix; uniform mat3 uNormalMatrix; void main(void) { vec4 mvTransform = uModelViewMatrix * aInstanceTransform * vec4(aVertexPosition, 1.0); vTexCoord = aVertexTexCoord; vPosition = mvTransform.xyz; vNormal = normalize(uNormalMatrix * aVertexNormal); gl_Position = uProjectionMatrix * mvTransform; } 

Aquí es donde establezco los datos de vértice:

 glBindBuffer(GL_ARRAY_BUFFER, mVBO_InstanceData); glBufferData(GL_ARRAY_BUFFER, instanceData.size() * sizeof(glm::mat4), instanceData.data(), GL_STATIC_DRAW); glEnableVertexAttribArray(3); glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast<GLvoid*>(0)); glVertexAttribDivisor(3, 1); // increment instance data by 1 each iteration glEnableVertexAttribArray(4); glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast<GLvoid*>(sizeof(glm::vec4))); glVertexAttribDivisor(4, 1); glEnableVertexAttribArray(5); glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast<GLvoid*>(2 * sizeof(glm::vec4))); glVertexAttribDivisor(5, 1); glEnableVertexAttribArray(6); glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), reinterpret_cast<GLvoid*>(3 * sizeof(glm::vec4))); glVertexAttribDivisor(6, 1); 

Algunos de location calificadores de location no son compatibles con la versión de 300 es shader. Su sombreador de vértices contiene estas definiciones:

 layout (location = 0) out vec3 vPosition; ... 

La especificación GLSL ES 3.00 dice:

Los sombreados de vértice no pueden tener calificadores de diseño de salida.

Esta restricción sólo se levanta en la versión 3.10, donde la redacción correspondiente ha cambiado a:

Los sombreados de vértices y fragmentos permiten que los calificadores de diseño de ubicación en las declaraciones de variables de salida.

Casi lo mismo se aplica a los uniformes, donde se utiliza:

 layout (location = 0) uniform bool uInstanceRendering; ... 

También aquí, shader versión 3.00 no permite clasificadores de layout en uniformes:

Los calificadores de diseño se pueden utilizar para bloques uniformes, pero no para declaraciones uniformes no bloqueadas.

Una vez más, esta opción fue agregada en la versión 3.10.

Me di cuenta de que el uso de 'glBindAttribLocation' en lugar de clasificadores de diseño en el sombreado vértice corrige el problema. Incluso usé el mismo esquema de numeración que el que tenía con los calificadores de diseño. Me pregunto si podría haber establecido los datos de la instancia con 4 vec4? Supongo que el mat4 lanza el esquema de numeración en mi dispositivo móvil?

  • Mal rendimiento de Android Canvas.drawBitmap - cambiar a OpenGL?
  • Android GLSurfaceView con fondo dibujable
  • Los límites de Viewport en cualquier resolución con OpenGL ES
  • Uso de opengl para renderizar cada elemento en un listview en android
  • Bajo rendimiento al ejecutar eglSwapBuffer y eglMakeCurrent
  • Android: el renderizado de OpenGL se detiene cuando se ejecuta una gran tarea de fondo
  • Renderizar la representación de script es mucho más lento que el renderizado de OpenGL en Android
  • Renderización de Android OpenGLES con C ++ y Java
  • ¿Cómo puedo utilizar varios componentes GLSurfaceView en el mismo Layout?
  • Obtener las líneas de GL10 dibujo de imágenes junto a la otra, la solución?
  • ¿Por qué libgdx SpriteBatch / BitmapFont rompe Texture.bind?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.