:
좋은 정보가에 위치해 있습니다. 피하려는 것은 작은 드로 콜을 많이 사용하고 서로 다른 버퍼를 자주 바인딩해야한다는 것입니다.
과도한 오버 헤드를 피하기 위해 버퍼의 크기는 엄청나게 많아서 경험칙을 제공하는 것이 거의 불가능합니다. 다음 요소가 포함됩니다.
- 하드웨어 성능 특성.
- 드라이버 효율성.
- 조각 수에 대한 정점 수 (삼각형 크기).
- 쉐이더의 복잡성.
일반적으로 단일 버텍스 버퍼에서 동시에 그리는 유사/관련 개체를 유지하는 것이 좋습니다.
모든 것을 단일 버퍼에 넣는 것은 극단적 인 것으로 보이며 실제로 악영향을 미칠 수 있습니다. 주어진 프레임에서 작은 부분 집합 만 렌더링하는 큰 "세계"가 있다고 가정 해보십시오. 극단적 인 경우 한 거대한 버퍼의 모든 꼭지점을 가지고 있으면 그 버퍼는 각 그리기 호출에 대해 GPU에 액세스 할 수 있어야합니다. 버퍼가 할당되는 방식 아키텍처에 따라, 그리고이 의미 할 수있다 :
- 너무 큰 있다면 문제가 될 수있다 헌정 GPU 메모리 (예를 들어, VRAM)에서 버퍼를 유지하려고.
- 메모리를 GPU 주소 공간에 매핑합니다.
- 메모리 고정/배선.
매우 큰 버퍼에 위의 항목 중 하나를 적용해야하지만 프레임을 렌더링하는 데 작은 비율 만 사용하면 이러한 작업에 많은 낭비가 있습니다. VRAM이있는 시스템에서는 텍스처와 같은 다른 할당도 VRAM에 맞지 않게 할 수 있습니다.
glDrawArrays()
또는 glDrawRangeElements()
과 같이 인수로 지정된 버퍼의 하위 집합에만 액세스 할 수있는 호출로 렌더링하는 경우 드라이버가 전체 버퍼 GPU에 액세스하지 못하도록하는 것이 가능할 수 있습니다. 그러나 나는 반드시 그 일을 믿지 않을 것입니다.
그래, 환경, 정적 오브젝트, 동적 오브젝트와 같은 장면에서 다른 것들을위한 작은 버퍼를 만들 것이다. 컬링을 사용하여 필요한 객체 만 버퍼에로드합니다. 하지만 적절한 쉐이더로 어떻게 그릴 수 있습니까? 이러한 객체를 하나씩 (객체가 보이는지 확인하고, 객체를 버퍼에로드하고, 무언가가 변경되었는지/버퍼의 데이터를 변경하고, 버퍼를 바인드하고, 셰이더를 사용하고, 버퍼에서 범위를 그리고, 바인드 해제하는지), 또는 방법이 있는지 확인해야합니다. 한 번에 모든 것을 그릴 수 있습니까? – nullable