여러 객체를 렌더링하는 데 몇 개의 OpenGL 프로그램을 사용해야합니까?


10

내 장면에는 여러 객체가 있습니다. (3 개의 큐브, 1 개의 실린더, 8 개의 구를 가정 해 봅시다.) 각 버텍스 쉐이더를 만들어야한다고 가정합니다. 몇 개의 프로그램이 있어야합니까?

대안 :

  • 객체 당 하나의 프로그램
  • 모든 큐브를위한 하나의 프로그램과 모든 구체를위한 다른 프로그램 (같은 쉐이더를 사용한다고 가정)
  • 모든 것을위한 하나의 큰 프로그램

올바른 접근법은 무엇입니까?


1
"각각에 꼭짓점 셰이더를 만들어야한다고 생각합니다." 왜 이것을 가정합니까? 꼭짓점 셰이더는 모델 및 뷰 행렬에 따라 꼭짓점을 변환하며 거의 모든 것이 동일하게 유지되기를 원합니다.
usm

답변:


8

셰이더 프로그램은 상태와 질감의 비슷한 부분으로 고려해야합니다. 상태를 변경하는 것은 비용이 많이 들기 때문에 텍스처 변경을 피하기 위해 여러 텍스처를 하나로 결합하여 벗어날 수 있습니다. 셰이더에도 동일하게 적용됩니다. 상태 변경을 피하기 위해 여러 셰이더를 결합 할 수 있습니다.

텍스처 결합과 마찬가지로 셰이더 결합은 오버 헤드가 발생합니다. 4096x4096 텍스처에서 16x16 픽셀 영역 만 렌더링하는 경우 하드웨어를 효율적으로 사용하지 않는 것입니다. 마찬가지로 렌더링하는 객체가 셰이더에서 코드의 10 % 만 사용하는 경우 그래픽 카드가 불필요하게 많은 것을 계산할 수 있습니다.

간단히 말해서 "의존".


4
또한 많은 경우 하나의 셰이더만으로도 도망 갈 수 있습니다. 색상, 질감, 노멀 맵 등과 같이 셰이더에 전달하는 유니폼에만 차이가 있습니다.
rioki

예를 들어, "Scaly"셰이더를 사용하면 비늘처럼 보이는 조각을 생성 할 수 있으며,이를 사용하여 3 개의 큐브, 1 개의 실린더 및 8 개의 구를 모두 렌더링 할 수 있습니다 (대부분의 셰이더는 ...) 하나의 셰이더 (물론 상응하는 지오메트리 프리미티브 포함). 여기서 합리적인 유니폼 세트는 색상을 정의하는 벡터 값일 수 있으며, 스칼라 또는 시각적 효과의 "스 칼리"또는 "빛나는"정도에 영향을주는 스칼라 일 수도 있습니다. 그런 다음 하나의 셰이더가 있고 개별 지오메트리의 그리기 사이의 유니폼을 변경하여 셰이더의 색상 조각 방식을 변경합니다.
Steven Lu

5

가능한 한 간단하게 유지하는 것이 가장 좋습니다. 모든 객체에 동일한 쉐이더를 복제하는 것은 불필요하며 빠르게 부풀어 오릅니다. 또한 불필요한 모든 오버 헤드가 발생하기 때문에 가능한 모든 사용 사례를 포괄하는 하나의 거대한 쉐이더를 원하지 않습니다.

셰이더 관리에 대한 몇 가지 의견이 있으며 이에 대한 "최적의"방법은 없습니다. 모든 셰이더가 매개 변수를 기반으로 즉석에서 생성되는 셰이더 구현도 보았습니다 (예 : 언리얼 엔진 ).

이 영역에서 막 시작한 사람에게는 기본 쉐이더를 먼저 연필로 쓰는 것이 좋습니다. 예를 들어 텍스처리스 오브젝트 용 쉐이더, 기본 텍스처 및 픽셀 별 조명 지원 쉐이더 등이 있습니다. 그런 다음 이전 쉐이더로는 수행 할 수없는 다른 효과를 원할 때마다 새로운 효과를 위해 새로운 것을 만듭니다.

그러한 시스템의 목적은 일을 단순하게 유지하는 것입니다. 다만. 유지. 그것. 단순한.


현재 업계에서하는 일을 언급했기 때문에 +1입니다.
Krythic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.