2011-10-12 12 views
5

Dalla sezione 5.8 di The OpenGL® ES Shading Language (v1.00, r17) [PDF] (sottolineatura mia):È possibile utilizzare glVertexAttribPointer per assegnare un vettore più piccolo a uno più grande?

L'operatore di assegnazione memorizza il valore del rvalue-espressione nella lvalue e restituisce un rvalue con il tipo e la precisione del Ivalue espressione . L'espressione lvalue e espressione -valore devono avere lo stesso tipo. Tutte le conversioni di tipi desiderate devono essere specificate esplicitamente tramite un costruttore.

Così suona come fare qualcosa di simile sarebbe non essere legale:

vec3 my_vec3 = vec3(1, 2, 3); 
vec4 my_vec4 = my_vec3; 

E per rendere legale la seconda linea dovrebbe essere qualcosa di simile:

vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component 

Ho pensato che lo glVertexAttribPointer avesse requisiti simili. Cioè, se si assegnasse a un vec4 il parametro size dovrebbe essere uguale a 4.

Quindi mi sono imbattuto nel GLES20TriangleRenderer sample for Android. Alcuni frammenti rilevanti:

attribute vec4 aPosition; 

maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); 

GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 
     TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 

Così aPosition è un vec4, ma la chiamata a glVertexAttribPointer che viene utilizzato per impostare ha una size di 3. È questo codice corretto, è GLES20TriangleRenderer basandosi su un comportamento non specificato, o c'è qualcos'altro Mi manca?

risposta

10

La dimensione dei dati di attributo passati allo shader non deve corrispondere alla dimensione dell'attributo in quello shader. È possibile passare 2 valori (da glVertexAttribPointer) a un attributo definito come vec4; i due valori rimanenti sono zero, ad eccezione del componente W che è 1. E allo stesso modo, è possibile passare 4 valori ad un attributo vec2; i valori extra vengono scartati.

Quindi è possibile combinare gli attributi vertice con i valori caricati tutto ciò che si desidera.

+0

Interessante. Questo comportamento è documentato da qualche parte? –

+0

@LaurenceGonsalves: è documentato nella specifica OpenGL ES. –

+6

Speravo in qualcosa di più specifico. :-) Per la cronaca, questo sembra essere documentato nella sezione 2.8 delle specifiche, "Array di Vertex", sotto l'intestazione "Trasferimento di elementi di array". –

Problemi correlati