2011-08-08 21 views
7

(내 랩톱이 그 버전을지나 가지 않기 때문에 2.1로 지정했습니다. 3.x 이후로 어쨌든이 작업을 수행했을 것입니다. 필수적으로 쉐이더를 도입 했습니까?).OpenGL 2.1 버텍스 버퍼 객체

Wikipedia 덕분에 : http://en.wikipedia.org/wiki/Vertex_Buffer_Object VBO를 사용하는 것이 얼마나 간단한 지 파악하기 시작했습니다. (아직 IBO에 대해 긍정적이지는 않습니까?) 지금까지 내가 이해 한 것은 데이터가 비디오 메모리에 저장된다는 사실로 인해 성능이 향상된다는 것입니다.

내가 알고 싶은 것은 실용적인 맥락에서 어떻게 사용해야하는지입니다. 예를 들어 내가 본 모든 것은 하나의 Vertex Buffer Object를 설정하고 하나의 삼각형 또는 하나의 큐브를 그리는 것입니다. 2 개 이상을 그리려면 어떻게해야합니까? 내가 그리려는 각 엔티티에 대해 새 VBO를 설정합니까? 아니면 초기에 설정 한 정적 VBO에 마술처럼 추가합니까?

+0

매우 관련없는 의견 : 전자 메일을 이해하면 VBO에 대해 긍정적 인 태도를 취할 수 있고 IBO에 대해서는 긍정적 인 태도를 취할 수 있습니다. 실용적인 애플리케이션에서는'glDrawArrays' 대신'glDrawElements'를 사용합니다. –

+0

@Christian Rau : 제 질문을 분명히하지 않았을 수 있습니다. 하나의 글로벌 VBO 대신 여러 VBO를 만들어야하는지 여부가 궁금합니다. –

+0

질문을 이해했습니다. 켄 (Ken)은 IBO가 VBO보다 그다지 어렵지 않다는 것입니다. –

답변

5

질문에 따라 상당히 다릅니다.

정점 속성에 하나의 VBO를 사용하고 각 모델/객체/엔티티/메쉬에 대한 색인에 하나를 사용하는 것은 직접적인 접근 방식입니다. 모든 모델을 단일 VBO에 저장하면 많은 이점을 얻을 수 있으므로 버퍼를 너무 자주 바인딩 할 필요가 없지만 정적 모델이 아닌 다른 문제가 발생합니다. 또한 객체 당 여러 개의 VBO를 사용할 수 있습니다. 동적 데이터에 하나, 정적 데이터에 하나 또는 기하 데이터 (위치 ...) 및 재료 관련 데이터 (texCoords ...) 하나를 사용할 수 있습니다.

개체 당 하나의 VBO를 사용하면 장점이있을 수 있으며, 하나의 거대한 VBO를 사용하면 좋은 아이디어가 아닐 수도 있습니다. 단지 구체적인 적용과 그 개념이 얼마나 잘 적용되어 있느냐에 달려 있습니다. 하지만 처음에는 똑바로 한 VBO 개체 당 접근 방식이 그다지 좋지 않습니다.)

+0

쿼드 당 하나의 VBO 및 IBO를 사용할 수 있습니까? Sprite 객체를 설정 중입니다. –

+0

@Storm 쿼드 당 하나의 VBO를 사용할 수 있지만 그리기 호출 당 하나의 쿼드 만 렌더링 할 수 있습니다. 이는 스프라이트 개체 (단일 쿼드로만 구성됨)를위한 것일 수 있습니다.그러나 파티클 시스템에서와 같이 매우 똑같은 스프라이트가 많이있는 경우에는이 모든 스프라이트/입자를 단일 VBO로 묶어야하므로 모든 것을 한 번에 렌더링 할 수 있습니다. 내가 말했듯이, 이것은 구체적인 적용에 달려 있으며, 입자 시스템은 분명히 하나의 VBO 접근 방식을 선호합니다. –

+0

그건 의미가 있습니다. 비슷한 스프라이트에 대한 스프라이트 그리기 호출을 배치하는 방법이 있을까요? 나는 XNA가 그들의 SpriteBatch로 이것을한다고 생각한다. –

2

정말 쉽습니다. VBO에 더 많은 데이터를 추가하기 만하면됩니다.

예를 들어, 1 대신 3 개의 삼각형을 렌더링하려면 9 개의 꼭지점을 glBufferData으로 보내야합니다. 그런 다음 모든 것을 렌더링하려면 glDrawArrays(GL_TRIANGLES, 0, 9); 전화를 사용해야합니다. 정말 간단해야합니다.

하지만 IBO에 대한 요점은 VBO와 전혀 다른 점이 없기 때문에 실제로는 익숙해 져야한다는 것입니다. 이것이 실제로 VBO를 사용하는 실제적인 방법입니다. 여러 개의 삼각형은 대개 같은 표면을 덮기위한 것이기 때문에 (예 : 큐브가 12 개의 삼각형을 필요로 함) VBO 만 사용하면 정점 데이터를 지정하는 데 많은 반복이 발생합니다. 인덱스 버퍼를 사용하면 모든 반복이 VBO에서 제거되므로 훨씬 효율적입니다. VBO/IBO에서 VBO/IBO로 이동하는 간결한 예제를 제공하는 this을 찾았으며 변경 사항에 대한 좋은 설명을 제공합니다.

+0

유용한 튜토리얼이었습니다. 감사합니다. –

+0

+1 Eddy Luten의 책에 대한 링크, 정말 좋아하는 프로젝트. –

+0

그래, 방금 오늘 책을 발견했고, 그의 간결한 작문 스타일에 정말 감탄했습니다. –

관련 문제