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?
Interessante. Questo comportamento è documentato da qualche parte? –
@LaurenceGonsalves: è documentato nella specifica OpenGL ES. –
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". –