OpenGL ES에서 쿼드를 그리는 가장 빠른 방법은 무엇입니까?


22

OpenGL ES 2.0을 사용하고 있습니다. 쿼드를 그려야합니다 .GL_QUADS를 사용하는 것처럼 쿼드 당 4 개의 정점 만 통과하면 좋을 것입니다. 그러나 기본적으로는 별도의 쿼드의 무리.

지금까지 내가 찾은 것 : -GL_TRIANGLES (쿼드 당 6 개의 정점) -GL_TRIANGLE_STRIP (쿼드 당 6 개의 정점)

내가 찾은 가능성 : 쿼드 스트립을 재설정하는 특수 인덱스 값을 가진 -GL_TRIANGLE_STRIPS

답변:


33

인덱스 버퍼와 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 인 2 개의 삼각형이 만들어 지므로 아무것도 그리지 않습니다. 두 번째 쿼드 인덱스 (4, 5, 6, 7)를 고려하십시오. 두 쿼드의 GL_TRIANGLE_STRIP에 대한 인덱스 버퍼는 {0, 1, 2, 3, 3, 4,4, 5, 6, 7} 일 수 있습니다. 축퇴 삼각형은 3,3,43,4,4입니다. 이것을 할 가치가 있습니까? 쿼드가 공통 모서리와 쌍을 이루는 경향이 없다면 아닙니다. 두 번째 쿼드가 {3, 2, 4, 5}이면 strip is {0,1,3,2,5,4}입니다.
ToolmakerSteve

8
그리고 함께 와서 많은 쿼드를 그려야하는 사람에게 이것을 분명히하기 위해 : 성능을 위해 위의 코드를 복사 하지 말고 glDrawElements를 한 번에 한 번씩 호출 하십시오 . 대신, 하나의 꼭지점 배열과 그리려 는 모든 쿼드를 포함하는 하나의 인덱스 배열을 만듭니다. GL_TRIANGLES를 사용하면 두 개의 쿼드에 인덱스가 {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입니다
ToolmakerSteve

6

Apple 문서에 나와있는 것처럼 인덱스 버퍼를 사용하는 것이 반드시 더 빠를 필요 는 없습니다 . "최상의 성능을 위해 모델을 glDrawArrays를 사용하여 인덱스가없는 단일 삼각형 스트립으로 제출해야합니다." .

그래서, 동안 GL_TRIANGLE_STRIP 는 인덱스 버퍼가 필요없는 4 개의 정점으로 수행하지만 인덱스 버퍼 사용할 있지만 2 개의 정점을 반복하여 "저장"하려고 시도하는 것은 상당히 절망적 입니다. 이러한 이유로 대각선에 2 개의 꼭지점을 반복하고 2 개의 꼭지점을 반복하는 것이 좋습니다GL_TRIANGLES .


8
음 .. 아니야. 그 의사의 말에 따르면 모델은 단일 INDEXED 삼각형 스트립으로 제출됩니다. 그리고 바로 다음 문장은 "정점 버퍼에서 동일한 정점에 대한 데이터를 여러 번 지정하지 않도록하려면 별도의 인덱스 버퍼를 사용하고 glDrawElements 함수를 사용하여 삼각형 스트립을 그립니다." 정확히 당신이 결정한 것은 '불명예'입니다.
davidf2281

3
doc 단락이 이제 glDrawArrays가 아닌 glDrawElements를 참조한다고 가정하면, 아마도이 답변 이후에 다시 쓰여졌을 것입니다. 그럼에도 불구하고, 의사가 수행 한 요점은 성능을 위해 단일 스트립 (여러 스트립이 아니라 여러 gl 호출)을 제공한다는 것입니다. 이 상황에서 나는 지수 사용의 차이가 중요하지 않다고 믿는다 . 중요한 것은 모든 것을 단일 정점 배열 (선택적 색인 배열)로 가져 와서 단일 gl 호출을 할 수 있다는 것입니다.
ToolmakerSteve

0

데스크탑에서 가장 큰 장점은 데이터를 GL_STATIC_DRAW VBO로 옮기는 것입니다. 아마도 이것은 iPhone의 MBX GPU에서도 마찬가지입니다.


-2

GL_TRIANGLE_FAN쿼드에 사용 하면 6이 아닌 4 개의 정점이 사용됩니다.


GL_TRIANGLE_STRIP다른 답변이 이미 지적했듯이 그렇습니다 .
Anko

@씨. ㅋ - 당신은 효율적으로 수행하는 방법이다 질문의 요점 놓친 무리 쿼드을. 각 쿼드에 대해 gl 호출을하지 말고 단일 gl 호출로 그릴 수있는 많은 쿼드를 단일 배열로 결합해야합니다. GL_TRIANGLE_FAN은이 작업에 도움이되지 않으므로 고성능 렌더링에는 거의 유용하지 않습니다.
ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.