Rendering Pipeline Details
Forward Rendering Path Details

Deferred Shading Rendering Path

이 페이지는 디퍼드 쉐이딩rendering path에 대하여 상세하게 설명합니다. 기술적인 개요에 대해서는 the wikipedia page를 참고하세요.

개요

디퍼드 쉐이딩을 사용할 경우, 오브젝트에 영향을 주는 라이트 개수의 제한이 없습니다. 모든 라이트는 픽셀당 평가되는데 이것은 노멀 맵과 정확하게 상호작용이 이루어짐을 말합니다. 또한 모든 라이트는 라이트 쿠키와 그림자를 가질 수 있습니다.

디퍼드 쉐이딩은 라이팅 처리 오버헤드가 라이트들이 비추는 픽셀의 수에 비례한다는데에 이점이 있습니다. 이것은 얼마나 많은 오브젝트가 비춰지는냐에 상관없이 씬 내의 라이트 볼륨 사이즈에 의해 결정됩니다. 그러므로 이것을 작게 유지할 때 성능을 개선할 수 있습니다. 디퍼드 라이팅은 또한 매우 일관적이며 예측한 가능한 동작을 합니다. 각 라이트 효과는 픽셀마다 계산되므로 큰 삼각형에서 라이팅 연산이 어색해지지 않습니다.

단점으로는, 디퍼드 쉐이딩은 안티 앨리어싱을 지원하지 않으며 또한 반투명 오브젝트를 처리할 수 없다는 단점이 있습니다 (이들은 forward 렌더링을 사용하여 렌더링해야 합니다). 또한 메쉬 렌더러의 Receive Shadows 플래그가 지원되지 않고 컬링 마스크는 제한적으로 지원됩니다. (컬링 마스크는 최대 4개까지 밖에 사용할 수 없습니다. 즉 컬링 레이어 마스크는 적어도 모든 레이어에서 4개의 임의의 레이어를 뺀 수를 포함해야 하기 때문에 32 레이어 중 28은 설정해야 합니다. 그렇지 않으면 그래픽 이미지의 혼란이 발생할 수 있습니다.)

요구사항

It requires a graphics card with Multiple Render Targets (MRT), Shader Model 3.0 (or later), support for Depth render textures and two-sided stencil buffers. Most PC graphics cards made after 2006 support deferred shading, including GeForce 8xxx and later, Radeon X2400 and later, Intel G45+ and later. On mobile, support is much more limited due to MRT formats used (some GPUs which do support multiple render targets, still only support very limited bit counts).

Note: Deferred rendering is not supported when using Orthographic projection. If the camera’s projection mode is set to Orthographic, these values are overridden, and the camera will always use Forward rendering.

퍼포먼스 고려사항

디퍼드 쉐이딩에서 실시간 라이트의 렌더링 오버헤드는 라이트에 의해 조명되는 픽셀의 수에 비례하고 화면의 복잡도와는 무관합니다. 이 때문에 작은 포인트 라이트이나 스포트라이트는 렌더링이 오버헤드가 더 적고, 또한 전체 또는 일부가 오클루전되면 더욱 저렴해집니다.

물론, 그림자가 있는 라이트가 그림자가 없는 라이트에 비해 비싼 것은 당연합니다. 디퍼드 쉐이딩에서 그림자를 투영하는 오브젝트는 각각의 그림자를 투영하는 라이트마다 한 번 이상 렌더링될 필요가 있습니다. 또한 그림자를 적용하는 라이팅 쉐이더는 그림자를 비활성화한 경우에 비해 렌더링 오버 헤드가 커집니다.

구현 세부사항

디퍼드 쉐이딩이 사용되면, 유니티 안에서 렌더링 과정은 2개의 패스로 이루어 집니다:

  1. G-buffer Pass: 오브젝트들이 디퓨즈 색상, 스펙큘러 색상, 메끄러움(smoothness), 월드 공간 법선, 방사(emission), 깊이를 포함하는 스크린-공간 버퍼들을 만들기 위해서 렌더링됩니다.

  2. Lighting pass: 이전에 생성된 버퍼들은 라이팅을 발광(emission) 버퍼에 추가하기 위해 사용됩니다.

이 과정이 완료된 후, 디퍼드 쉐이딩 처리를 할 수 없는 쉐이더를 가지는 오브젝트들이 forward rendering 패스를 사용하여 렌더링됩니다.

기본 G버퍼 레이아웃은 다음과 같습니다:

  • RT0, ARGB32 format: Diffuse color (RGB), occlusion (A).
  • RT1, ARGB32 format: Specular color (RGB), roughness (A).
  • RT2, ARGB2101010 format: World space normal (RGB), unused (A).
  • RT3, ARGB2101010 (non-HDR) or ARGBHalf (HDR) format: Emission + lighting + lightmaps + reflection probes buffer.
  • Depth+Stencil buffer.

그래서 기본 g-버퍼 레이아웃은 160 bits/pixel (non-HDR) 또는 192 bits/pixel (HDR).

카메라가 HDR을 사용하지 않을 때, 보통 ARGB32에서 가능한 것보다 더 큰 다이내믹 레인지를 제공하기 위해서 발광 & 라이팅 버퍼는 대수적으로 인코딩됩니다.

Note that when the camera is using HDR rendering, then there’s no separate render target being created for Emission+lighting buffer (RT3); instead the render target that the camera will render into (i.e. the one that will be passed to the image effects) is used as RT3.

G-Buffer Pass

G버퍼 패스는 각 오브젝트를 한번 렌더링합니다. 디퓨즈, 스페큘러 색상, 표면 매끄러움(smoothness), 월드 공간 법선, 발광+앰비언트+리플렉션+라이트맵이 g버퍼 텍스처들에 렌더링됩니다. g버퍼 텍스처들은 앞으로 쉐이더에 의한 접근을 가능하게 하기 위해 전역 쉐이더 프로퍼티로 설정됩니다 (CameraGBufferTexture0 .. CameraGBufferTexture3 names).

Lighting Pass

라이팅 패스는 g-버퍼에 기반하여 라이팅을 계산합니다. 라이팅은 화면-공간에서 계산되므로, 그것을 처리하는 데에 걸리는 시간은 화면 복잡도와는 관계없습니다. 라이팅은 발광(emission)버퍼에 추가됩니다.

카메라 니어 클립에 교차하지 않는 포인트 조명과 스포트라이트는 3D 그래픽으로 렌더링된 씬에 대한 Z 버퍼 테스트가 활성화됩니다. 이로 인해 일부 또는 전체가 오클루전된 포인트 라이트나 스포트라이트는 렌더링이 매우 저렴합니다. 니어 클립 플레인을 교차하지 않는 Directional Light(지향성 라이트) 및 포인트 라이트・스포트라이트는 전체 화면의 사각형으로 렌더링됩니다.

라이트의 그림자가 활성화되어 있는 경우, 그것들도 렌더링된 경로에 적용됩니다. 그림자는 “공짜”가 아니라는 것을 명심하십시오, shadow caster(그림자의 투영)도 렌더링해야 하며, 더 복잡한 라이트 쉐이더도 적용해야 합니다.

사용 가능한 유일한 라이팅 모델은 Standard 입니다. 다른 모델을 사용하길 원한다면, Built-in shaders 의 Internal-DeferredShading.shader 파일에 대한 수정된 버전을 “Asset” 폴더 내의 “Resources”라는 이름의 폴더에 위치시킴으로써 라이팅 패스 쉐이더를 수정할 수 있습니다.

Rendering Pipeline Details
Forward Rendering Path Details