2016-10-17 3 views
-1

각 타일에 꼭지점 모델이있는 타일 기반 렌더러를 만들고 있습니다. 그러나, 각 정점 모델로부터 단지 하나의 프레임에 작은 부분 만 렌더링됩니다. 이러한 하위 집합은 모든 프레임을 변경합니다.큰 버퍼 스위치 대 작은 버퍼 스위치

가장 빠른 방법은 무엇입니까? 다음 옵션을 생각해 볼 수 있습니다.

  1. 모든 모델에 대해 하나의 그리기 호출을 만듭니다. 모든 모델은 GPU에 저장됩니다. 모든 드로우 콜마다 매번 전체 vbo가 전환됩니다. 그런 다음 인덱스를 사용하여 실제 렌더링에 적합한 작은 부분을 선택합니다.
  2. 다른 모든 vbos의 필요한 (작은) 하위 집합을 복사하여 모든 프레임을 어셈블 링하는 하나의 vbo로 하나의 그리기 호출을 작성합니다 (데이터는 vram 내에 복사됩니다).
  3. 하나의 vbo로 하나의 그리기 호출을 작성하지만 vbo는 glBufferData를 사용하여 CPU 데이터의 (작은) 하위 집합으로 모든 프레임에서 재생성됩니다.

가장 빠른 것 같습니까? 아니면 더 빠른 것을 생각할 수 있습니까?

더 큰 VBO 사이를 전환하는 것이 더 작은 VBO 사이를 전환하는 것보다 비용이 많이 드는 것은 분명히 하나의 결정 요인입니다.

+2

그냥 측정 해보세요. – knivil

답변

0

많은 드월을 만드는 것은 나쁜 생각입니다. OpenGL에서이 방법으로 CPU를 사용하게 될 것이므로 많은 모델을 배치하는 것이 좋습니다.

사실이 방법을 사용합니다. 모든 정적 지오메트리는 하나의 VBO와 하나의 VAO 안에 있습니다. 그렇다고 "한 번의 전화 요청"만있는 것은 아닙니다. 그러나 glMultiDraw * Indirect를 사용해야합니다. GPU에서 컬링을 수행하기 위해 계산 쉐이더를 사용해야하며 다중 간접 draw 호출과 함께 GL_INDIRECT_PARAMETERS 확장과 같은 것을 사용해야한다는 아이디어가 묻혔습니다. Indirect Drawing

모든 동적 지오메트리에 대해 영구 버퍼를 사용할 수 있습니다.

vao/vbo 변경에 대한 질문에 답변하십시오. VAO를 변경하거나 glBindVertexBuffer를 사용하면 큰 오버 헤드가 발생하지 않습니다.

하지만 드라이버/하드웨어에 따라 다를 수 있습니다.