답변:
인덱스 버퍼와 GL_TRIANGLES를 사용하십시오. 이 경우 쿼드 당 4 개의 정점 + 6 개의 인덱스가 필요합니다 (6 개의 추가 인덱스는 오버 헤드가 커질 수 있지만 실제로는 그렇지 않습니다. 일단 인덱스 버퍼를 구성한 후에는 다시 터치 할 필요가 없습니다). 자세한 내용은 이 페이지를 참조하십시오 (glDrawElements 검색).
간단한 예제 코드 :
GLfloat vertices[] = {-1, -1, 0, // bottom left corner
-1, 1, 0, // top left corner
1, 1, 0, // top right corner
1, -1, 0}; // bottom right corner
GLubyte indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
0,2,3}; // second triangle (bottom left - top right - bottom right)
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
또한 하나의 쿼드 만 그리는 경우 삼각형 스트립 ( wikipedia에 표시된 것처럼 ) 으로 그리는 데 4 개의 정점이 필요 하지만 이미 알고있는 것 같습니다.
{0,1,2, 0,2,3, 4,5,6, 4,6,7}
있거나 같을 수 있습니다 {0,1,2, 2,3,0, 4,5,6, 6,7,4}
. 이것을 돕는 좋은 수업은 glText-Android / SpriteBatch입니다
Apple 문서에 나와있는 것처럼 인덱스 버퍼를 사용하는 것이 반드시 더 빠를 필요 는 없습니다 . "최상의 성능을 위해 모델을 glDrawArrays를 사용하여 인덱스가없는 단일 삼각형 스트립으로 제출해야합니다." .
그래서, 동안 GL_TRIANGLE_STRIP
는 인덱스 버퍼가 필요없는 4 개의 정점으로 수행하지만 인덱스 버퍼 를 사용할 수 있지만 2 개의 정점을 반복하여 "저장"하려고 시도하는 것은 상당히 절망적 입니다. 이러한 이유로 대각선에 2 개의 꼭지점을 반복하고 2 개의 꼭지점을 반복하는 것이 좋습니다GL_TRIANGLES
.
GL_TRIANGLE_FAN
쿼드에 사용 하면 6이 아닌 4 개의 정점이 사용됩니다.
GL_TRIANGLE_STRIP
다른 답변이 이미 지적했듯이 그렇습니다 .
3, 4,
4, 5, 6, 7} 일 수 있습니다. 축퇴 삼각형은3,3,4
및3,4,4
입니다. 이것을 할 가치가 있습니까? 쿼드가 공통 모서리와 쌍을 이루는 경향이 없다면 아닙니다. 두 번째 쿼드가 {3, 2, 4, 5}이면 strip is{0,1,3,2,5,4}
입니다.