디퍼 드 셰이딩은 나중 단계에 대한 실제 셰이딩 작업을 "지연"하는 기술 일뿐입니다. 10 개의 패스가 필요한 10 개의 조명을 렌더링하는 데 필요한 패스 수를 줄이는 것이 좋습니다 (예 :). 요점은 사용중인 렌더링 기술에 관계없이 렌더링 파이프 라인에서 처리 해야하는 객체 (정점, 법선 등)의 수를 줄이는 렌더링 최적화가 있습니다.
렌더링 최적화에 대한 사실상의 표준은 없지만, 특정 성능 특성을 달성하기 위해 상호 교환 가능하거나 함께 사용될 수있는 많은 기술이 있습니다. 각 기법을 사용하는 것은 렌더링되는 장면의 특성에 크게 좌우됩니다.
디퍼 드 렌더링은 조명 수가 증가 할 때 문제를 해결하려고합니다. 앞으로 렌더링에서는 패스 수가 폭발 할 수 있습니다.
이러한 기술은 지연 음영 부분을 직접 최적화하지는 않지만 설명에 따르면 지연 음영 부분은 문제가 아닙니다. 그러나 문제는 전체 장면을 렌더링 파이프 라인에 제출한다는 것입니다. 따라서 엔진은 결과를 g- 버퍼에 제출할 수 있도록 장면에서 처리해야합니다 (예 : 모든 1 억 개의 정점). 이러한 1 억 개의 정점은 대부분 사소하게 제거 될 수 있으며 전처리 정점 및 조각이 전달됩니다.
순방향 렌더러 N 정점의 경우 총으로 정점 스테이지에 의해 처리 될 vertex count*lights count
과의 총량 프래그먼트 스테이지에 의해 fragments count*number Lights
효과적으로 만이 감소 음영 지연, vertex count
정점 스테이지와 fragments count
해결 전에 프래그먼트 카운트 실제 음영. 그러나 여전히 N은 처리하기에 너무 많을 수 있습니다. 특히 대부분이 사소하게 추려 질 수 있습니다.
이는 포워드 렌더링 / 여러 패스의 경우 컬링을보다 효과적으로 만듭니다. 혼자 음영 지연된 것은 할 수 있기 때문에 그러나, 대부분의 엔진은 듀얼 렌더링 방법을 사용하는 것을 염두에 두어야 하지 투명 물체를 해결하는 최적화에게 필수을 사용하여이 만든다, 나는 그들 모두를하지 않는 상용 엔진 모르겠어요.
절두체 컬링
뷰 절두체에 완전히 또는 부분적으로 포함 된 객체 만 렌더링 파이프 라인에 제출하면됩니다. 이것은 프러스 텀 컬링의 기본 개념으로, 안타깝게도 메시가 뷰에 있는지 여부를 확인하는 것입니다. 프러스 텀은 값 비싼 작업 일 수 있습니다. 대신 엔진 설계자는 (AABB) 축 정렬 경계 상자 또는 경계 영역과 같은 대략적인 경계 볼륨을 사용합니다. 실제 메쉬를 사용하는 것만 큼 정확하지는 않지만 정확도 차이는 실제 메쉬를 확인하는 데 어려움이 없습니다.
바운딩 볼륨을 사용하더라도 실제로 각 볼륨을 확인할 필요는 없으며, 이를 통해 초기 컬링을 수행하기 위해 바운딩 볼륨 계층 을 구성 할 수 있습니다. 이를 사용하면 장면의 복잡성에 크게 의존합니다.
이것은 작은 엔진을위한 좋고 간단한 기술이며, 내가 사용한 모든 엔진에 거의 사용됩니다. 엔진에 매우 복잡한 장면을 렌더링 할 필요가 없으면 계층 구조없이 "일반"경계 볼륨 / 절두체 검사를 사용하는 것이 좋습니다.
뒷면 컬링
어쨌든 보이지 않는면을 그리는 이유는 무엇입니까? 렌더링 API는 뒷면 컬링을 켜거나 끄는 인터페이스를 제공합니다. 특정 상황에서 뒷면을 그려야하는 일부 CAD 응용 프로그램과 같이 전원을 켜지 않는 강력한 이유가 없다면 반드시해야 할 일입니다.
폐색 컬링
Z- 버퍼를 사용하면 가시성 결정을 해결할 수 있습니다. 그러나 문제는 Z- 버퍼가 성능 측면에서 항상 크지는 않다는 것입니다 .Z- 버퍼는 파이프 라인의 후반 단계에서만 해결할 수 있기 때문에 폐색되는 객체는 래스터 화되고 Z- 버퍼에 쓰여질 수 있습니다. Z 테스트에 실패하기 전의 컬러 버퍼.
오 클루 전 컬링은 렌더링 절두체에있는 폐쇄 된 오브젝트를 컬링하기 위해 초기 테스트를 수행하여이를 해결합니다. 오 클루 전 컬링의 실제 구현 중 하나는 포인트 기반 쿼리를 사용하고 특정 포인트 뷰에서 특정 객체가 표시되는지 확인하는 것입니다. 최종 이미지에 기여하지 않는 조명을 컬링하는 데 사용될 수도 있습니다. 이는 지연된 엔진 렌더러에서 특히 유용합니다.
그러한 기술의 위대한 실제 예는 GTA5에 있습니다. 고층 빌딩은 도시 중심에 계단식으로 배치되어 장식 일뿐 만 아니라 폐색 장치로도 작동하여 도시의 나머지 부분을 효과적으로 차단하고 래스터 화.
디테일의 정도
세부 수준은 널리 사용되는 기술이며, 메시가 장면에 덜 기여할 때 더 간단한 버전의 메시를 사용하는 것이 좋습니다. 두 가지 일반적인 구현이 있습니다. 하나는 더 이상 크게 기여하지 않을 때 더 간단한 것으로 메쉬를 전환합니다. 메쉬는 메쉬가 차지하고있는 거리 및 픽셀 수 (스 크리 영역)와 같은 요소에 따라 선택됩니다. 다른 버전은 메시를 동적으로 테셀 레이트하며, 이는 지형 렌더링에 널리 사용됩니다.
이 모든 것이 작동하지 않으면 어떻게됩니까?
좋은 질문입니다.
가장 먼저해야 할 일은 그래픽 프로파일 러를 사용하여 응용 프로그램을 프로파일 링하고 병목 현상의 위치를 확인하는 것입니다. 렌더링되는 내용이 변경되면 병목 현상이 변경 될 수 있습니다. 병목 현상은 CPU에서 실행되는 코드의 일부일 수도 있으므로이를 측정해야합니다.
그런 다음 병목 현상에 대한 최적화를 수행해야하며 이에 대한 정답이 없으며 하드웨어마다 다를 수 있습니다.
몇 가지 일반적인 GPU 최적화 트릭 :
- 쉐이더에서 분기하지 마십시오.
- 예를 들어
{VNT}
동일한 배열 또는 {V},{N},{T}
다른 배열에 인터리브 된 다른 정점 구조를 사용해보십시오 .
- 장면을 앞뒤로 그립니다.
- 예를 들어 이미지에 Z 테스트가 필요하지 않은 경우 Z 버퍼를 끄십시오.
- 압축 된 텍스처를 사용하십시오.
몇 가지 일반적인 CPU 최적화 트릭 :
- 작은 기능에는 인라인 기능을 사용하십시오.
- 가능하면 SIMD (단일 명령 다중 데이터)를 사용하십시오.
- 캐시에 친숙하지 않은 메모리 점프를 피하십시오.
- "올바른"양의 데이터가있는 VBO를 사용하십시오. (하드웨어에 따라 다름) 드로우 콜이 적을수록 좋습니다.
그러나 병목 현상이 지연된 쉐이딩에 있다면 어떻게해야합니까?
이 경우 디퍼 드 셰이딩이 라이트에 더 관심이 있기 때문에 가장 분명한 부분은 실제 셰이딩 계산을 최적화하는 것입니다. 계속 지켜봐야 할 몇 가지 사항 :
- 실제로 최종 이미지에 영향을주는 조명을 렌더링합니다. 다시 말해, 기여하지 않는 조명을 끄십시오. 앞에서 언급 한 오 클루 전 컬링을 사용하여 효과적으로 구현할 수 있습니다.
- 이 라이트에는 반사 또는 다른 구성 요소가 필요합니까? 아마.
- 이 빛이 그림자를 드리 우나요? 일부 조명은 그림자를 드리울 필요가 없습니다.
- 이 가벼운 기여를 미리 계산할 수 있습니까? 움직이지 않으면 아마도 일부 측면이 사전 계산 될 수 있습니다.