2011-09-28 5 views
11

이것은 멍청한 질문 일 수 있습니다. 내가 이해 하듯이, glBindAttribLocation (..., AAA, ...)은 AAA가 고유 한 한 AAA의 위치 ID에 프로그램 내의 속성을 바인딩합니다. 나는 다음과 같은 코드가있는 경우 :GLES2 glBindAttribLocation()이 필요합니까?

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

이 위치 ID 0과 1에 내 두 개의 변수를 바인딩을 그때 부를 것이다 :

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); 

는 지금까지 본인은의 ID를 0과 1은 glVertexAttribPointer()에 첫 번째 매개 변수로 전달됩니다.

위와 같이 glGetAttribLocation() 호출을 통해 위와 같이 속성의 위치 ID를 얻으면 리턴 된 ID가 0과 1 대신 5와 6이되므로 5를 전달할 수 있다고 가정하는 것이 안전합니까? glVertexAttribPointer() 및 glEnableVertexAttribArray() 대신 0 및 1 ??

답변

13

glGetAttribLocation()은 올바른 색인을 반환합니다. 그래서 예, glVertexAttribPointer() 및 glEnableVertexAttribArray()에서 이러한 값을 사용하는 것이 안전합니다.

그러나 각 셰이더에 대해 glGetAttribLocation을 호출하면 캐싱하지 않으면 값이 비쌀 수 있습니다. glBindAttribLocation()을 사용하면 관습을 사용할 수 있습니다. 위치는 항상 0, 위치는 1 등입니다.