Crash al usar matrices como atributos de sombreado de vértices

Estoy tratando de crear un sombreado de vértice OpenGL que tiene una matriz de transformación adicional para cada vértice. Mi código de sombreado tiene este aspecto:

uniform mat4 mvpMatrix; attribute vec3 coordinates; attribute mat4 vertexTransformation; attribute vec4 vertexColor; varying vec4 v_color; void main() { vec4 pos = vec4( coordinates, 1 ); pos = vertexTransformation * pos; pos = mvpMatrix * pos; gl_Position = pos; v_color = color; } 

Cada vez que ejecuto esto en el emulador de Android, el emulador se bloquea.

Intenté aislar el problema y descubrí que sucede, siempre que vertexTransformation atributo vertexTransformation . El código siguiente también da como resultado un bloqueo, incluso si no hay más operaciones matriciales implicadas.

 uniform mat4 mvpMatrix; attribute vec3 coordinates; attribute mat4 vertexTransformation; attribute vec4 vertexColor; varying vec4 v_color; void main() { vec4 pos = vec4( coordinates, 1 ); pos = mvpMatrix * pos; gl_Position = pos; vec4 col = vec4( 0,0,0,1 ); if ( vertexTransformation[0][0] == 0.5 ) v_color = color; else v_color = vec4( 1, 1, 1, 1 ); } 

Estoy usando glBufferData para pasar los datos:

 ByteBuffer vertexData = ...; vertexData.position( 0 ); GLES20.glBufferData( GLES20.GL_ARRAY_BUFFER, vertexData.remaining(), vertexData, GLES20.GL_STATIC_DRAW ); 

Y luego enlazar los atributos con

 int handle = GLES20.glGetAttribLocation( programId, "vertexTransformation" ); GLES20.glEnableVertexAttribArray( handle ); GLES20.glVertexAttribPointer( handle, 16, GLES20.GL_FLOAT, false, 92, 28 ); 

¿Qué estoy haciendo mal? ¿Hay alguna manera de proporcionar atributos de matriz a un vértice y usarlos en el sombreado de vértices?

Este blurb de código es incorrecto:

 int handle = GLES20.glGetAttribLocation( programId, "vertexTransformation" ); GLES20.glEnableVertexAttribArray( handle ); GLES20.glVertexAttribPointer( handle, 16, GLES20.GL_FLOAT, false, 92, 28 ); 

Atributos vértice en OpenGL son siempre de 4 componentes, por lo tanto, un atributo mat4 vértice es en realidad 4 matrices secuenciales de 4 componentes.

Esta es la forma correcta de manejar un atributo mat4 vertex:

 int handle = GLES20.glGetAttribLocation( programId, "vertexTransformation" ); GLES20.glEnableVertexAttribArray( handle ); GLES20.glVertexAttribPointer( handle, 4, GLES20.GL_FLOAT, false, 92, 28 ); GLES20.glEnableVertexAttribArray( handle + 1 ); GLES20.glVertexAttribPointer( handle + 1, 4, GLES20.GL_FLOAT, false, 92, 28+16 ); GLES20.glEnableVertexAttribArray( handle + 2 ); GLES20.glVertexAttribPointer( handle + 2, 4, GLES20.GL_FLOAT, false, 92, 28+32 ); GLES20.glEnableVertexAttribArray( handle + 3 ); GLES20.glVertexAttribPointer( handle + 3, 4, GLES20.GL_FLOAT, false, 92, 28+48 ); 

Observe cómo se requiere 4 punteros de atributo vértice? El atributo de vértice "vertexTransformation" ocupa en realidad las ubicaciones handle través de handle+3 .

  • Pasar atributos personalizados a un shader de fragmentos personalizado
  • ¿Es posible usar pixmaps en Android a través de Java API para GLES?
  • OpenGL ES - glReadPixels
  • Conversión de YUV a RGB por fragment shader
  • Problemas para que SurfaceTexture funcione con Android Videoplayer en MALI 400
  • ¿Qué tipo de efectos secundarios tiene libgdx numSamples?
  • ¿Es OpenGL en Android un asesino de la batería?
  • Cómo crear la pantalla de carga en libgdx?
  • ¿Cuál es la diferencia entre los paquetes android.opengl y javax.microedition.khronos.opengles?
  • Cómo acelerar la carga / compilación de shader en Android
  • Detectar los toques del usuario sobre un cuadrado OpenGL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.