2011-12-31 2 views
1

OpenGL VBO가 대형 지오메트리 배열에만 사용되는지 아니면 작은 배열에도 사용할지 여부를 알고 싶었습니다. 다른 지오메트리와 관련하여 다양한 지오메트리를 배치하는 코드가 있지만 "리프"지오메트리 객체 중 일부는 매우 작고 10x10 크기의 구형 등 (각각 200 개의 삼각형)입니다. 나는이 작은 잎 개체가 매우 많을 수 있습니다. 이 작은 잎 개체 각각에 대해 다른 변형 행렬을 가질 수 있기를 원합니다. 두 가지 옵션이있는 것 같습니다 :많은 수의 작은 VBO를 사용하는 성능

  1. 각 리프 개체에 별도의 VBO를 사용하십시오. 나는 다수의 VBO로 끝날지 모른다.

  2. 하나의 VBO에 여러 개체의 데이터를 저장할 수 있으며 지정된 리프 개체의 데이터를 변경할 때 적절한 변환을 직접 적용 할 수 있습니다. 이것은 OpenGL의 요점 중 하나는 하드웨어에서 많은 수의 행렬 연산을 효율적으로 수행하기 때문에 이상하게 보입니다. 나는 OpenGL이 하드웨어에서 아주 잘하도록 설계된 소프트웨어를하고있을 것이다.

많은 VBO가 비효율적입니까? 아니면 그냥 옵션 1을 선택해야합니까? 작은 물건을 많이 가지고있는 상황을 다루는 더 좋은 방법이 있습니까? 대신에 버텍스 배열 같은 것을 사용해야할까요? http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

내가 한 메쉬 당 200 개 삼각형이 너무 적은 수의 그 각각에 대한 VBO와 아마 성능이 훨씬 줄어들지 않습니다 메쉬가 아니라고 생각 :

답변

1

좋은 정보가에 위치해 있습니다. 불행히도 그것은 하드웨어 사양에 의존합니다.

하나의 거대한 버퍼가 큰 성능 차이를 얻지 못할 것입니다 ... 나는 최상의 옵션이 하나의 VBO 당 여러 개의 (그러나 전부는 아님) 객체를 저장하는 것이라고 생각합니다.

하나의 버퍼를 사용하는 렌더 : 그걸로 아무런 문제가 없습니다 ... 단지 하나의 버퍼가 바인딩되어 있고 다른 매개 변수로 glDrawArrays를 사용할 수 있습니다. 예를 들어 하나의 메쉬 (100 개) 버텍스로 구성되어있는 경우, 버퍼 번째 당신이 그 메시 (10)가 당신이 버퍼를 변경하면 최소화 그런 식으로

glDrawArrays(triangles, 0, 100); 
glDrawArrays(triangles, 100, 100); 
glDrawArrays(triangles, ..., 100); 
glDrawArrays(triangles, 900, 100); 

을 사용할 수 있으며 여전히 매우 효율적으로 렌더링 할 수 있습니다.

"작은"개체가 같은가요? 그것들은 같은 기하 구조를 가지고 있지만 다른 변형/재료를 가지고 있습니까? 아마 "인스 턴싱"을 사용하는 것이 가치가 있을까요?

+0

인스 턴싱이란 무엇입니까? – Gravity

+0

여기에 몇 가지 정보가 있습니다. http://sol.gfxile.net/instancing.html하지만 기본적으로 동일한 객체를 여러 번 렌더링하는 최적화 된 방법입니다 (그러나 다른 변형과 재료를 사용합니다) – fen

2

가장 최적의 솔루션 데이터가 정적 인 단 하나의 메시 display lists 한 VBO를 사용하는 것이 하나의 객체 구성합니다. 그렇지 않으면 일반적으로 주 끌기 루프에서 렌더링 이외의 작업을 수행하지 않는 것이 좋습니다.

  • 추가하거나 초기화 후 개체를 제거 (또는 객체 모프) 할 필요가 없을거야 경우

    는 영구적으로 하나의 버퍼를 결합하고 다른 개체를 렌더링하기 위해 보폭/오프셋 값을 변경할 아마 더 효율적입니다.

  • 정적으로 유지 될 기본 지오메트리 세트 만있는 경우 하나의 VBO를 사용하고 추가/제거/변형 할 수있는 지오메트리에 대해 별도의 VBO를 사용하십시오.

  • 마음대로 개체를 삭제하거나 제거 할 수 있으면 각 개체에 자체 VBO가 있어야 메모리 관리가 훨씬 간단 해집니다.

+0

내 지오메트리가 정적 인 경우에도, 다른 변형이 다른 리프 기하학 오브젝트에 적용될 수 있다는 사실을 어떻게 다룰 것인가? 아니면 정적이라고 생각하지 않습니까? 하나의 버퍼에 모든 것을 넣은 다음 지오 메트릭 객체를 가진 버퍼를 만드는 것보다 반복되는'glDrawRangeElements' 호출을 사용하는 것이 더 효율적입니까? – Gravity

+0

이 경우 나는 각 메쉬 (각 메쉬, 각 메쉬가 아닌)에 대해 별도의 VBO를 가지고 시작하여 각각의 변환을 따로 처리하는 것으로 시작합니다. 성능 문제라고 판단되면 최적화 할 것입니다. –

+5

오 주여, 표시 목록은 더 이상 사용되지 않습니다. ..... –

관련 문제