OpenGL ES 2.0의 형상 인스 턴싱


12

OpenGL ES 2.0에서 지오메트리 인스 턴싱을 계획하고 있습니다. 기본적으로 같은 지오메트리 (의자)를 장면에서 1000 번 렌더링하려고합니다.

OpenGL ES 2.0에서이를 수행하는 가장 좋은 방법은 무엇입니까?

모델 뷰 mat4를 속성으로 전달하는 것을 고려하고 있습니다. 속성은 꼭짓점 데이터이므로이 동일한 mat4를 전달해야합니다. 동일한 삼각형의 각 꼭짓점에 대해 세 번 (모델 뷰가 삼각형의 꼭짓점에서 일정하게 유지되므로).

이는 GPU에 전송되는 많은 추가 데이터에 해당합니다 (2 개의 추가 정점 * 16 부동 수 * (삼각형 수)의 추가 데이터 양).

또는 삼각형 당 한 번만 mat4를 보내야합니까? 그러나 속성이 "정점 당"데이터로 정의되므로 속성을 사용하여 어떻게 가능합니까?

OpenGL ES 2.0에서 인스 턴싱을 수행하는 가장 효율적인 방법은 무엇입니까?


3
정말 그리워 glVertexAttribDivisor:(
Will

답변:


9

ES2에는 glVertexAttribDivisor 또는 부동 소수점 텍스처가 없으므로 옵션이 상당히 제한됩니다.

아직 의자 모델을 VBO에 넣지 않은 경우. 거기서부터는 의자 당 하나씩 개별 드로우 콜로 제한되어 있으므로 각 의자에 대한 변환 매트릭스를 가능한 한 효율적으로 GPU로 가져 오는 문제입니다.

일반 glUniform 호출로이 작업을 수행하거나 추가 정점 속성 슬롯을 남용하고 각 의자를 그리기 전에 glVertexAttrib (참고 : glVertexAttribPointer가 아님)를 호출하여 4 개의 슬롯을 사용하여 매트릭스를 지정하면 이러한 값이 "고착"됩니다. 의자의 각 후속 정점. 그것은 일부 하드웨어에서는 빠르지 만 다른 것에서는 느릴 수 있으므로 실험해야합니다.

의자가 다른 것을 회전시키지 않으면 셰이더에 위치를 보내고 즉시 새 변형 행렬을 만드는 것입니다. 그것은 끔찍하게 들리지만 실제로는 엄청나게 빠르며 (3 개의 수레를 설정하는 것입니다) 작업을 수행 할 수 있습니다.

전체적으로, 그리고 당신이 전형적인 모바일 플랫폼을 목표로하고 있다고 가정하면, 당신이 무엇을 하든지 전화를 끌면 당신을 죽일 것이라고 생각합니다.


6

가장 좋은 방법은 스킨 모델과 비슷한 인스 턴싱 방식을 사용하는 것입니다. 의자 사본을 많이 보유 할 VBO를 생성하십시오. 이제 모든 정점에는 적용 할 변환 행렬에 대한 색인을 보유하는 바이트 속성이 있어야합니다. 매트릭스 배열을 셰이더에 보내고 각 의자의 월드 변형으로 사용하십시오. 이러한 방식으로 VBO의 데이터를 다시 쓰지 않고도 각 호출에서 배열 매개 변수의 최대 크기만큼 많은 의자를 그릴 수 있습니다.


3

Wolfire Games는 빠른 객체 인스 턴싱 에 관한 훌륭한 블로그 게시물을 보유하고 있습니다. 그들이하는 일은 모델을 여러 번 렌더링하지만 각 객체에 대해 다른 행렬을 균일 한 슬롯으로 보냅니다.

데이터를 한 번만 보내면 (일괄 객체를 렌더링 할 때 가장 큰 병목 현상이 발생 함) 모델을 셰이더로 변환하기 때문에 전체 객체를 인스턴스화하는 매우 효율적인 방법입니다.


+1 어쨌든, 여전히 Nvidia 텍스트 참조가 모바일 PVR 칩에도 적용되는지 확실하지 않습니다. 특히 드라이버 부분 에 대한 언급 . http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

이것은 WebGL에 대한 Google 토크이며 JavaScript 용 OpenGL ES이며 지오메트리 인스턴스가 없습니다. 병목 현상이 GPU 또는 CPU에 있는지 여부를 알 수 없으므로 말하기가 어렵지만 아이디어를 줄 수 있습니다.

균일 한 변수에 대해 배워야하지만 속성에 mat4를 보낼 필요가 없으며 의자의 모든 정점이 동일한 행렬로 변환되므로 삼각형이 아닌 모델 당 한 번만 보내야합니다. 균일 한 변수를 사용하면 쉐이더 프로그램 자체에서 설정할 수있는 특수한 변수입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.