이 페이지에서는 디퍼드 셰이딩 렌더링 경로에 대해 자세하게 설명합니다. 기술에 대한 대략적인 설명은 위키피디아: 디퍼드 셰이딩을 참조하십시오.
디퍼드 셰이딩을 사용하면 게임 오브젝트에 영향을 미칠 수 있는 광원의 수에 제한이 없습니다. 모든 광원이 픽셀별로 계산되므로 노멀 맵 등과 올바르게 상호작용합니다. 또한 모든 광원이 쿠키와 그림자를 가질 수 있습니다.
디퍼드 셰이딩은 조명 프로세싱 작업 부하가 광원으로부터 빛을 받는 픽셀의 수와 비례한다는 장점이 있습니다. 즉, 작업 부하가 씬에서 광원으로부터 빛을 받는 게임 오브젝트의 개수와 상관없이 광원의 체적 크기에 따라 결정됩니다. 따라서 광원을 적게 유지하면 성능을 개선할 수 있습니다. 또한 디퍼드 셰이딩은 동작이 매우 일정하고 예측하기 쉽습니다. 각 광원의 영향은 픽셀별로 계산되므로 큰 삼각형에서 작게 나눠지는 조명 연산이 발생하지 않습니다.
그러나 디퍼드 셰이딩은 안티앨리어싱을 제대로 지원하지 않고, 반투명 게임 오브젝트를 처리할 수 없다는 단점이 있습니다. 해당 오브젝트는 포워드 렌더링을 사용하여 렌더링해야 합니다. 또한 메시 렌더러의 Receive Shadow 플래그를 지원하지 않고, 컬링 마스크를 제한적으로만 지원하여 4개까지만 사용할 수 있습니다. 따라서 컬링 레이어 마스크에는 적어도 임의 레이어 4개를 제외한 모든 레이어가 포함되어야 하므로 32개 레이어 중 28개 레이어를 설정해야 합니다. 그렇지 않으면 그래픽 결함이 발생합니다.
MRT(Multiple Render Targets), Shader Model 3.0 이상, 뎁스 렌더 텍스처를 지원하는 그래픽 카드가 필요합니다. 2006년 후에 제조된 GeForce 8xxx, Radeon X2400, Intel G45 이상의 PC 그래픽 카드는 대부분 디퍼드 셰이딩을 지원합니다.
모바일 기기에서는 OpenGL ES 3.0 이상을 실행하는 모든 기기에서 지원됩니다.
참고: *직교 투사를 사용할 때에는 디퍼드 렌더링이 지원되지 않습니다. 카메라의 투사 모드가 직교로 설정되어 있을 때 카메라는 포워드 렌더링을 대신 사용합니다.
디퍼드 셰이딩에서 실시간 광원의 렌더링 작업 부하는 광원으로부터 빛을 받는 픽셀 수에 비례하며, 씬의 복잡도는 렌더링 작업 부하에 영향을 미치지 않습니다. 따라서 작은 점이나 스폿 광원을 렌더링할 때에는 매우 적은 리소스가 사용되고, 작은 점이나 스폿 광원의 전체 또는 일부가 씬의 게임 오브젝트에 의해 가려진다면 더욱 적은 리소스가 사용됩니다.
물론 그림자를 드리우는 광원이라면 그림자를 드리우지 않는 광원보다 훨씬 더 많은 리소스가 사용됩니다. 디퍼드 셰이딩에서는 그림자를 드리우는 광원이 있을 때마다 그림자를 드리우는 게임 오브젝트를 한 번 이상 렌더링해야 합니다. 또한 조명 셰이더는 그림자를 적용해야 할 때에 그렇지 않을 때보다 렌더링 리소스를 훨씬 많이 사용합니다.
디퍼드 셰이딩을 지원하지 않는 셰이더가 포함된 오브젝트는 디퍼드 셰어링이 완료된 후에 포워드 렌더링 경로를 사용하여 렌더링됩니다.
아래에서 지오메트리 버퍼(g버퍼) 내 렌더 타겟(RT0 - RT4)의 기본 레이아웃을 확인할 수 있습니다. 데이터 타입은 각 렌더 타겟의 여러 채널에 배치됩니다. 사용되는 채널은 괄호 안에 표시되어 있습니다.
따라서 기본 g버퍼 레이아웃은 160비트/픽셀(비HDR) 또는 192비트/픽셀(HDR)입니다.
섀도우 마스크 또는 디스턴스 섀도우 마스크 모드를 혼합 조명에 사용하는 경우 다음과 같은 다섯 번째 타겟이 사용됩니다.
따라서 g버퍼 레이아웃은 192비트/픽셀(비HDR) 또는 224비트/픽셀(HDR)입니다.
하드웨어에서 5개의 동시 렌더 타겟을 지원하지 않는 경우 섀도우 마스크를 사용하는 오브젝트는 포워드 렌더링 경로로 폴백(fallback)합니다. 이미션+조명 버퍼(RT3)는 로그로 인코딩되어 카메라가 HDR을 사용하지 않을 때 ARGB32 텍스처를 사용하여 일반적으로 얻을 수 있는 것보다 더 큰 계조 범위(dynamic range)를 제공합니다.
카메라에서 HDR 렌더링을 사용하는 경우 이미션+조명 버퍼(RT3)에 대해 렌더 타겟이 별도로 생성되지 않고, 카메라가 렌더링되는 렌더 타겟(즉 이미지 이펙트에 전달되는 타겟)이 RT3으로 사용됩니다.
G버퍼 패스는 각 게임 오브젝트를 한 번씩 렌더링합니다. 디퓨즈 및 스페큘러 컬러, 표면 평활도, 월드 공간 노멀, 이미션+앰비언트+반사+라이트맵은 g버퍼 텍스처로 렌더링됩니다. G버퍼 텍스처는 셰이더에서 나중에 액세스할 수 있도록 전역 셰이더 프로퍼티로 설정됩니다(CameraGBufferTexture0 .. CameraGBufferTexture3 names).
조명 패스는 g-버퍼와 뎁스를 기준으로 조명을 연산합니다. 조명은 화면 공간에서 연산되므로 처리 시간은 씬 복잡도와 무관합니다. 조명은 이미션 버퍼에 추가됩니다.
카메라 전방 절단면(near plane)을 지나지 않는 점과 스폿 광원은 씬에 대한 Z 버퍼 테스트가 활성화된 상태에서 3D 모양으로 렌더링됩니다. 따라서 일부 또는 전체가 가려진 점과 스폿 광원을 렌더링하는 데에는 매우 적은 리소스가 사용됩니다. 카메라 전방 절단면을 지나는 방향 광원, 점 광원, 스폿 광원은 전체화면 사각형으로 렌더링됩니다.
광원에 그림자가 활성화된 경우 그림자도 렌더링되고 이 패스에서 적용됩니다. 그림자를 렌더링하는 데에 아무런 비용이 들지 않는 것은 아닙니다. 그림자를 드리우는 오브젝트도 렌더링해야 하고 더 복잡한 광원 셰이더를 사용해야 하기 때문입니다.
스탠다드 조명 모델만 사용 가능합니다. 다른 모델을 원하는 경우 Internal-DeferredShading.shader 파일의 수정 버전을 빌트인 셰이더에서 “Assets” 폴더의 “Resources”라는 폴더로 옮겨서 조명 패스 셰이더를 수정하면 됩니다. 그런 다음 Graphics 설정(메뉴: Edit > Project Settings로 이동한 다음 Graphics 카테고리 클릭)을 엽니다. “Deferred” 드롭다운을 “Custom Shader”로 변경한 다음 셰이더 옵션을 사용 중인 셰이더로 변경합니다.
2017–06–08
Unity 5.6에서 광원 모드(Shadowmask and Distance Shadowmask) 추가됨