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.
- ¿Cómo se muestra fps con opengl es (android)
- Android OpenGL Effectfactory, cómo aplicar múltiples efectos?
- Android Opengl 2.0 Alpha Mezcla tema - texturas medio transparentes
- Filtro esférico en android
- Cómo configurar / calcular texturebuffer en glTexCoordPointer al importar desde archivo OBJ
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?
- Renderización de Android OpenGLES con C ++ y Java
- Shader para Android OpenGL ES
- Android Openg GL ES 2 dibujo grandes texturas lento
- Cómo cargar texturas en OpenGL ES de manera eficiente
- LibGDX - Shader trabajando en el escritorio pero no en Android
- 2D API o OpenGL ES para un juego de Android 2D?
- OpenGLES mezcla de partículas pero no de fondo
- Añadir HTML / JS / CSS GUI a la aplicación OpenGL (Android e iOS)
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
.
- ¿Cambia el Id de registro cuando el usuario actualiza o reinstala la aplicación
- ¿Cómo optimizo mejor Picasso en un GridView?