Desde la sección 5.8 de The OpenGL® ES Shading Language (v1.00, r17) [PDF] (énfasis mío):¿Se puede usar glVertexAttribPointer para asignar un vector más pequeño a uno más grande?
El operador de asignación almacena el valor de la rvalue-expresión en el lvalue y devuelve un valor p con el tipo y la precisión de la lvalue-expresión . La expresión lvalue y la expresión rvalue deben tener el mismo tipo. Todas las conversiones de tipo deseadas deben especificarse explícitamente mediante un constructor.
por lo que suena como hacer algo como esto sería no ser legal:
vec3 my_vec3 = vec3(1, 2, 3);
vec4 my_vec4 = my_vec3;
Y para que sea legal la segunda línea tendría que ser algo como:
vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component
Supuse que glVertexAttribPointer
tenía requisitos similares. Es decir, si estuviera asignando a un vec4
que el parámetro size
debería ser igual a 4.
Luego me encontré con el GLES20TriangleRenderer sample for Android. Algunos fragmentos relevantes:
attribute vec4 aPosition;
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
Así aPosition
es un vec4
, pero la llamada a glVertexAttribPointer
que se utiliza para establecer que tiene un size
de 3. ¿Es este código correcto, es GLES20TriangleRenderer
depender de la conducta no especificada, o hay alguna otra cosa ¿Estoy perdido?
Interesante. ¿Este comportamiento está documentado en alguna parte? –
@LaurenceGonsalves: está documentado en la especificación OpenGL ES. –
Esperaba algo un poco más específico. :-) Para el registro, esto parece estar documentado en la sección 2.8 de la especificación, "matrices de vértices", bajo el título "Transferencia de elementos de matriz". –