Forward Rendering Path Details
Vertex Lit 렌더링 패스 상세정보

Legacy Deferred Lighting Rendering Path

이 페이지에서는 Legacy Deferred Lighting (light prepass) rendering path의 세부사항을 설명합니다. Deferred Lighting의 기술적인 개요에 대해서는 this article for a technical을 참조하십시오.

Note: 디퍼드 라이팅은 Unity 5.0 이후부터는 레거시 기능으로 됩니다. 따라서 표준 쉐이더, 리플렉션 프로브와 같은 몇몇 렌더링 기능을 지원하지 않습니다. 새 프로젝트의 경우 Deferred Shading 렌더링 패스를 사용하는 것을 고려해야 할 것입니다.

NOTE: Deferred rendering is not supported when using Orthographic projection. If the camera’s projection mode is set to Orthographic, the camera will always use Forward rendering.

개요

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

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

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

요구사항

It requires a graphics card with Shader Model 3.0 (or later), support for Depth render textures and two-sided stencil buffers. Most PC graphics cards made after 2004 support deferred lighting, including GeForce FX and later, Radeon X1300 and later, Intel 965 / GMA X3100 and later. On mobile, all OpenGL ES 3.0 capable GPUs support deferred lighting, and some of OpenGL ES 2.0 capable ones support it too (the ones that do support depth textures).

퍼포먼스 고려 사항

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

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

구현 세부사항

디퍼드 라이팅이 사용될 때, Unity에서의 렌더링 과정은 세 개의 경로로 이루어집니다:

  1. Base Pass: 오브젝트들이 깊이, 법선, 스페큘러 파워를 포함한 스크린-스페이스 버퍼들을 생성하기 위해 렌더링됩니다.
  2. Lighting Pass: 먼저 생성된 버퍼들을 사용하여 라이팅 연산한 후 또 다른 스크린스페이스 버퍼에 저장합니다.
  3. Final Pass: 오브젝트가 다시 렌더링됩니다. 계산된 라이팅을 가져오고, 색상 텍스처와 합성하여 환경(ambient)/발광(emissive) 라이팅을 추가합니다.

Deferred Lighting을 처리할 수 없는 쉐이더가 있는 오브젝트는, 이 과정이 완료된 후, forward rendering 패스로 렌더링됩니다.

Base Pass

Base Pass에서는 각 오브젝트를 한 번씩 렌더링합니다. 뷰 공간의 노멀과 반사의 힘은 하나의 ARGB32 Render Texture에 렌더링됩니다(법선을 RGB 채널, 반사 강도는 알파 채널). 만약 플랫폼과 하드웨어에 따라, Z 버퍼의 텍스처 읽기를 지원하는 경우, 깊이는 명시적으로 렌더링되지 않습니다. 만약 Z 버퍼를 텍스처로 사용할 수 없는 경우, 깊이는 Shader Replacement를 사용하여 다른 렌더링 패스에서 렌더링됩니다.

Base Pass의 결과물은 씬의 내용이 담긴 Z 버퍼와 법선 맵・반사 강도를 포함하는 Render Texture입니다.

Lighting Pass

Lighting Pass는 깊이, 노멀 맵, 스페큘러 강도에 따라 라이팅을 계산합니다. 라이팅은 스크린 공간에서 계산되기 때문에, 처리에 걸리는 시간은 씬의 복잡성과 무관합니다 입니다. 라이팅 버퍼는 하나의 ARGB32 Render Texture에서 확산 조명을 RGB 채널, 흑백 반사 라이팅을 알파 채널에 포함됩니다. 라이팅 값은 대수적으로 인코딩되어 ARGB32 텍스처에서 일반적 가능 범위보다 범위가 넓은 다이나믹 레인지를 제공합니다. 카메라가 HDR 렌더링을 활성화했을 때, 라이팅버퍼는 ARGBHalf 형식이며 대수적인 인코딩은 수행되지 않습니다.

점 조명과 스포트라이트가 카메라 근평면에 교차되지 않은 경우, 씬에 대해서 깊이 테스트를 활성화하여 3D모양의 형태로 렌더링하게 됩니다. 근평면을 교차하는 라이트의 경우 역시 3D모양 형태로 렌더링되지만, 뒤집힌 깊이 테스트를 통한 후면을 렌더링합니다. 이로 인해 일부 또는 전체가 오클루드되어 렌더링을 매우 저렴하게 만듭니다. 라이트가 카메라 근평면과 원평면 모두를 동시에 가로지른다면, 위에서의 최적화는 사용될 수 없고 라이트는 깊이 테스트없는 꽉찬 사각형 형태로 그려집니다.

위의 내용은 방향광(directional light)에는 적용되지 않으며, 항상 전체화면 사각형으로 렌더링됩니다.

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

사용 가능한 유일한 라이팅 모델은 Blinn-Phong입니다. 다른 모델을 사용하려는 경우에는, Built-in Shader에서 Internal-PrePassLighting.shader 파일의 수정 버전을 “Assets”폴더 아래의 “Resources”폴더에 저장하여 라이팅 패스 쉐이더를 위치 시킴으로써 가능합니다.

Final Pass

Final Pass는 최종 렌더링 이미지를 생성합니다. 다음에 다시 라이팅를 불러올 쉐이더에 의해 모든 오브젝트는 렌더링되어, 텍스처와 합성하고, 발광 라이팅을 추가합니다. 라이트 맵도 Final Pass에 적용됩니다. 실시간 라이팅은 카메라의 가까이에서 사용되며, 베이크된 Indirect Lighting(간접 조명)만 추가됩니다. 이것은 카메라로부터 떨어진 곳에 있는 완전히 베이크된 라이팅과 크로스 페이드합니다.

Forward Rendering Path Details
Vertex Lit 렌더링 패스 상세정보