2011-10-12 18 views
5

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?

Respuesta

10

El tamaño de los datos de atributo pasados ​​al sombreador no tiene que coincidir con el tamaño del atributo en ese sombreador. Puede pasar 2 valores (desde glVertexAttribPointer) a un atributo definido como vec4; los dos valores sobrantes son cero, excepto el componente W que es 1. Y de forma similar, puede pasar 4 valores a un atributo vec2; los valores extra se descartan.

Para que pueda mezclar y unir los atributos de los vértices con los valores cargados todo lo que desee.

+0

Interesante. ¿Este comportamiento está documentado en alguna parte? –

+0

@LaurenceGonsalves: está documentado en la especificación OpenGL ES. –

+6

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". –

Cuestiones relacionadas