gl_quads를 사용하면 여전히 이점이 있습니까?


10

gl_quads는 더 이상 사용되지 않으므로 더 이상 사용하지 않을 것입니다. 또한 gl_quads를 사용하여 게임을 실행할 때 최신 PC가 실제로 두 개의 삼각형을 그리는 것으로 알고 있습니다.

이제 게임을 삼각형으로 대신 작성해야한다고 들었습니다. 그러나 OpenGL이 쿼드를 두 개의 삼각형으로 만드는 방법에 대한 세부 사항으로 인해 쿼드를 여전히 사용하는 것이 유리한지 궁금합니다.

특히, 나는 현재 다소 큰 버퍼 객체에서 많은 연결되지 않은 쿼드를 렌더링하고 있습니다. 내가 조심해야 할 영역 중 하나는이 버퍼 객체를 가져 오거나 업데이트하는 데 사용하는 부동 소수점 벡터의 크기입니다 (정점 당 상당히 많은 추가 부동 값과 버퍼에 많은 정점이 있습니다- 가장 큰 버퍼는 약 500KB입니다.

따라서 버퍼 객체를 변경하여 삼각형을 그리면이 정점 데이터가 50 % 더 커지고 (4 개가 아닌 사각형을 그리는 6 개의 정점이) CPU가 생성하는 데 50 % 더 오래 걸립니다.

gl_quads가 여전히 작동한다면 여기에서 이점이 있습니까, 아니면 OpenGL의 두 삼각형으로의 자동 변환에 여전히 50 %의 추가 메모리 및 CPU 시간이 사용되고 있습니까?


5
OpenGL은 일종의 인덱스 정점 버퍼를 지원한다고 확신합니다. 쿼드에 대해 동일한 4 개의 정점 만 저장하고 두 정점을 만들기 위해 전체 정점을 반복하는 대신 인덱스 만 반복한다는 의미입니다. [0,1,2] , [2,3,0]


GL 사양은 여전히 ​​glPolygonMode (..., GL_LINE)와 같이 쿼드로 그리기가 중요한 일부 경우를 규정한다고 생각합니다.
Maximus Minimus

답변:


5

실제 게임을 테스트하십시오. 쿼드가 더 빠르면 사용하십시오. 그렇지 않다면하지 마십시오.

일부 하드웨어는 쿼드를 지원하지 않기 때문에 드라이버가 쿼드 드로우 콜을 "수정"하기 위해 많은 작업을 수행해야하기 때문에 경우에 따라 속도가 느려질 수 있습니다. 일부 하드웨어는 일부 고정 기능 입력 어셈블리 단계에서 삼각형으로 분할하는 쿼드를 지원하므로 별다른 오버 헤드없이 작동합니다. 당신이 제기 한대로 인덱싱 된 인덱스와 인덱싱되지 않은 쿼드가 제출되는 방법과 제한된 버스 전송 대역폭 및 CPU 생성 시간을 더 잘 활용하는 방법에 관한 질문도 있습니다. 민속의 지혜는 쿼드를 피한다고 말합니다. 아무것도 시작하지 않으면 좋은 조언입니다. 코드가 이미 작동하면 그렇게 많이하지 않을 수도 있습니다. 민중의 지혜에 따르면, 성능이 뛰어난 실제 게임에도 불구하고 많은 것들이 성능을 떨어 뜨린다 고합니다.

간단히 말해서 테스트하십시오. 인터넷에 성능 조언을 요구하거나 요구하지 마십시오. 우리는 때때로 옳을 수도 있지만, 더 자주 우리는 오래된 데이터, 귀하가없는 특정 상황에 기초한 데이터 또는 우리가 직접 인터넷이나 동료로부터 간접적으로 획득 한 완전 쓰레기를 제공 할 것입니다. 직접 경험하십시오).


3

대안은 무엇입니까? 글쎄, 하나의 대안은 지오메트리 쉐이더 를 사용 하여 GL_LINES_ADJACENCY프리미티브 (4 버텍스)를 전달 하고 GS 가이 프리미티브를 삼각형 스트립으로 변환하도록하는 것입니다. 그러나 지오메트리 쉐이더는 항상 렌더링 속도가 느리기 때문에 렌더링 속도가 느려집니다.

더 좋은 방법은 인덱스 렌더링을 사용하는 것입니다. 여기에는 두 가지 대안이 있습니다. 기본 재시작 GL_TRIANGLESGL_TRIANGLE_STRIP함께. 후자는 약간 더 짧은 인덱스 버퍼 (쿼드마다 하나의 인덱스)가됩니다. 쿼드 렌더링에 동일한 인덱스 버퍼를 재사용 할 수 있으므로 인덱스 버퍼를 업데이트하거나 수정할 필요가 없습니다.

또한 부호없는 반바지를 색인 유형으로 사용하는 것이 좋습니다. 한 번에 16384 개 이상의 쿼드를 렌더링해야하는 경우 glDrawElementsBaseVertex 를 사용 하여 인덱스를 오프셋 하여 여러 렌더링 호출을 수행 하십시오.


내가 한 일부 최근 벤치마킹은 glMultiDrawArrays가 NV와 AMD 모두에서 빠른 경로가되었음을 보여줍니다 (Intel에서는 귀찮게하지 않았습니다).
Maximus Minimus

@ mh01 : 클라이언트 측 도면 명령 배열이 필요합니다. 당신은해야 할 것입니다 glMultiDrawArraysIndirect그것을 GPU 측을 할 수 있습니다. 할 수는 있지만 하드웨어를 제한합니다.
Nicol Bolas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.