2014-10-03 7 views
6

예를 들어, 메서드가 Render() 인 엔티티 (개체)가 5 개 있다고 가정 해 보겠습니다. 모든 엔티티는 렌더링을 위해 버퍼에 자체 정점을 설정해야합니다.큰 OpenGL 버텍스 버퍼 하나 또는 여러 개의 작은 것들?

다음 두 가지 옵션 중 어느 것이 더 낫습니다. 모든 개체가 glBufferSubData와 버퍼에 그 정점을 작성하여 (Render 방법에 인수로 전달 된 버퍼의 ID)를 사용합니다 glGenBuffer로 만든

  1. 를 사용하여 하나의 큰 사전 할당 된 버퍼.
  2. 모든 엔티티는 자체 버퍼를 만들고 사용합니다.

큰 버퍼가 더 좋은 경우 어떻게 적절한 셰이더와 모든 것을 사용하여이 버퍼의 모든 정점을 모든 엔터티에서 제대로 렌더링 할 수 있습니까?

답변

1

VBO (Vertex Buffer Object) 하나를 glGenBuffer과 함께 사용하는 것이 더 쉽지만 항상 최선의 방법은 아닙니다.이 방법은 사용 방법에 따라 다릅니다. 그러나 대부분의 경우 각 엔티티에 대해 1 개의 VBO를 갖는 것은 문제가되지 않으며 렌더링에 거의 영향을주지 않습니다. 여러 VBOs를 갖는 것이 아니라 그들이 특정 크기를 가지고 괜찮 OpenGL Vertex Specification Best Practices

8

:

좋은 정보가에 위치해 있습니다. 피하려는 것은 작은 드로 콜을 많이 사용하고 서로 다른 버퍼를 자주 바인딩해야한다는 것입니다.

과도한 오버 헤드를 피하기 위해 버퍼의 크기는 엄청나게 많아서 경험칙을 제공하는 것이 거의 불가능합니다. 다음 요소가 포함됩니다.

  • 하드웨어 성능 특성.
  • 드라이버 효율성.
  • 조각 수에 대한 정점 수 (삼각형 크기).
  • 쉐이더의 복잡성.

일반적으로 단일 버텍스 버퍼에서 동시에 그리는 유사/관련 개체를 유지하는 것이 좋습니다.

모든 것을 단일 버퍼에 넣는 것은 극단적 인 것으로 보이며 실제로 악영향을 미칠 수 있습니다. 주어진 프레임에서 작은 부분 집합 만 렌더링하는 큰 "세계"가 있다고 가정 해보십시오. 극단적 인 경우 한 거대한 버퍼의 모든 꼭지점을 가지고 있으면 그 버퍼는 각 그리기 호출에 대해 GPU에 액세스 할 수 있어야합니다. 버퍼가 할당되는 방식 아키텍처에 따라, 그리고이 의미 할 수있다 :

  • 너무 큰 있다면 문제가 될 수있다 헌정 GPU 메모리 (예를 들어, VRAM)에서 버퍼를 유지하려고.
  • 메모리를 GPU 주소 공간에 매핑합니다.
  • 메모리 고정/배선.

매우 큰 버퍼에 위의 항목 중 하나를 적용해야하지만 프레임을 렌더링하는 데 작은 비율 만 사용하면 이러한 작업에 많은 낭비가 있습니다. VRAM이있는 시스템에서는 텍스처와 같은 다른 할당도 VRAM에 맞지 않게 할 수 있습니다.

glDrawArrays() 또는 glDrawRangeElements()과 같이 인수로 지정된 버퍼의 하위 집합에만 액세스 할 수있는 호출로 렌더링하는 경우 드라이버가 전체 버퍼 GPU에 액세스하지 못하도록하는 것이 가능할 수 있습니다. 그러나 나는 반드시 그 일을 믿지 않을 것입니다.

+0

그래, 환경, 정적 오브젝트, 동적 오브젝트와 같은 장면에서 다른 것들을위한 작은 버퍼를 만들 것이다. 컬링을 사용하여 필요한 객체 만 버퍼에로드합니다. 하지만 적절한 쉐이더로 어떻게 그릴 수 있습니까? 이러한 객체를 하나씩 (객체가 보이는지 확인하고, 객체를 버퍼에로드하고, 무언가가 변경되었는지/버퍼의 데이터를 변경하고, 버퍼를 바인드하고, 셰이더를 사용하고, 버퍼에서 범위를 그리고, 바인드 해제하는지), 또는 방법이 있는지 확인해야합니다. 한 번에 모든 것을 그릴 수 있습니까? – nullable

관련 문제