2011-09-28 17 views
11

Esto podría ser una pregunta novato. Según tengo entendido, glBindAttribLocation (..., AAA, ...) vinculará un atributo dentro del programa a la ID de ubicación de AAA, siempre que AAA sea único. Si tengo el siguiente código:GLES2 ¿Es glBindAttribLocation() necesario?

glBindAttribLocation(..., 0, "XXX"); 
glBindAttribLocation(..., 1, "YYY"); 

Esto se unirá mis dos variables a la ubicación de identificación 0 y 1. Entonces yo llame:

glBindBuffer(GL_ARRAY_BUFFER, VBId); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBId); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void *) 0 + sizeof(float) * 3); 
glEnableVertexAttribArray(1); 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 

Hasta este punto, entiendo que los ID de 0 y 1 pasan a glVertexAttribPointer() como el primer parámetro.

¿Sería seguro asumir que si obtuve los ID de ubicación de los atributos (como arriba) a través de llamadas glGetAttribLocation(), de modo que los ID devueltos fueran 5 y 6 en lugar de 0 y 1, podría pasar 5 y 6 en glVertexAttribPointer() y glEnableVertexAttribArray() en lugar de 0 y 1 ??

Respuesta

13

glGetAttribLocation() devuelve el índice correcto. Entonces, sí, es seguro usar esos valores en glVertexAttribPointer() y glEnableVertexAttribArray().

Pero llamar a glGetAttribLocation para cada sombreador puede ser costoso si no lo almacena en caché. Usar glBindAttribLocation() permite usar una convención, la posición siempre en 0, normal en 1 y así sucesivamente.