http://unitykoreawiki.com/index.php?n=KrMain.RenderTech-DeferredLighting

지연된(Deferred) 라이트 랜더링 경로의 상세사항

이 페이지는 Deferred Lighting rendering path의 상세사항을 설명합니다. 지연된 라이팅(Deferred Lighting)에 대한 기술 적인 개요는 Deferred Lighting Approaches article을 참조하십시오.

Deferred Lighting은 대부분의 라이팅과 쉐이드 충실도의 랜더링 경로입니다:

  • 얼마나 많은 라이트가 오브젝트에 영향을 끼칠 수 있는지에 대한 제한은 없습니다.
  • 모든 라이트는 픽셀 당 평가됩니다. 이것은 그것이 노멀 맵과 어떻게 적절하게 상호작용 할 수 할 수 있는지 등을 의미합니다.
  • 모든 라이트는 쿠키를 가질 수 있습니다.
  • 모든 라이트는 쉐도우를 가질 수 있습니다.

지연된 라이팅의 이점은:

  • 라이팅 비용은 스크린 상의 라이트 크기에 비례합니다. 이 라이트가 몇 개의 오브젝트 위에서 빛나는 지는 중요하지 않습니다. 작은 라이트 = 저렴 입니다!

일관성. 모든 라이트를 위한 라이팅은 픽셀 당 계산됩니다; 커다란 triangles을 분해하는 라이팅 연산은 없습니다.

단점들:

  • 엘리어싱 제거 기능 없음.
  • 지연된 라이팅은 반 투명 오브젝트는 처리할 수 없습니다. 이들은 Forward Rendering을 사용하여 랜더링 됩니다.
  • 제한 된 라이팅 모델 지원 (Blinn-Phong). 모든 라이팅은 같은 방식으로 연산 됩니다; 다른 오브젝트라도 아주 상이한 라이팅 모델은 가질 수 없습니다.
  • "receive shadows" 플래그를 지원하지 않고 라이트 Culling Masks에 대한 제한적인 지원 제공.

지연된 라이팅의 요구사항

  • Unity Pro가 필수.
  • Shader Model 3.0 혹은 더 최신 그래픽 카드, Depth 랜더러 텍스처와 양면 스텐실 버퍼 지원. 2004년 이후에 만든 대부분의 그래픽 카드는 이 기능을 지원함: GeForce FX 그리고 더 최신, Radeon X1300 그리고 그 이후, Intel 965 / GMA X3100 그리고 그 이후.
  • 현재 모바일 플랫폼 상에서는 동작하지 않습니다.

성능 고려사항

지연된 라이팅에서 실제 라이트의 비용은 해당 라이트가 빛을 내는 픽셀 수에 비례합니다; 그러나 장면의 복잡도와는 관련이 없습니다. 그러므로 작은 점이나 집중 조명은 랜더링 비용이 저렴합니다. 점이나 집중 조명은 전적으로 혹은 부분적으로 GPU에서 오브젝트가 픽셀을 건너뛰는 장면에 의해 가려지므로 더 저렴합니다.

물론 쉐이드가 있는 라이트는 없는 것보다 값비쌉니다. 지연된 라이팅에서 그림자를 던지는 주체는 각각의 그림자를 드리우는 라이트를 위한 한번 혹은 그 이상 랜더링을 할 필요가 있습니다. 그리고 쉐도우가 적용되는 그 라이팅 쉐이더는 쉐도우가 없는 것보다 더 값비쌉니다.

구현 시 상세사항

지연된 라이팅이 사용될 때, 유니티의 랜더링 과정은 다음과 같이 진행됩니다:

  1. 기본 패스: 오브젝트가 랜더링 되며 depth, normals, and specular power을 가진 스크린-공간 버퍼를 만들어냅니다.
  2. 라이팅 패스: 라이팅이 이전 버퍼로부터 연산됩니다. 라이팅은 다른 스크린 공간 버퍼로 연산됩니다.
  3. 최종 패스: 오브젝트가 다시 랜더링 됩니다. 연산된 라이팅을 가지고 와서 색상 텍스처와 합치고 ambient/emissive 라이팅을 추가 합니다.

지연된 라이팅을 처리 할 수 없는 쉐이더를 가진 오브젝트들은 이 과정을 마치고 RenderTech-ForwardRendering 경로를 사용하여 랜더링 됩니다.

기본 패스(Base Pass)

기본 패스는 각 오브젝트를 한번 랜더링 합니다. 뷰 공간의 노멀과 반사 파워(specular power)는 하나의 ARGB32 Render Texture으로 랜더링 됩니다 (RGB 채널에서 노멀로, A에서 반사 파워로). 만일 플랫폼과 하드웨어가 Z 버퍼를 텍스처로 읽는 것을 지원한다면, 그러면 Depth는 명시적으로 랜더링 되지 않습니다. 만일 Z 버퍼가 텍스처로 접근할 수 없다면, 그 depth는 추가적인 랜더링 패스에서 shader replacement을 사용하여 랜더링 됩니다.

기본 패스의 결과는 노멀과 반사파워를 가진 장면 콘텐츠와 랜더러 텍스처로 채워진 Z 버퍼입니다.

라이팅 패스

라이팅 패스는 depth, normal 그리고 반사파워를 기반으로 라이팅을 연산합니다. 라이팅은 스크린 공간에서 연산되므로, 장면의 복잡도와는 관련이 없습니다. 라이팅 버퍼는 하나의 ARGB32 랜더러 텍스처로 RGB 채널에 분산 라이팅이, A 채널에 흑백 반사 라이팅이 있습니다. 라이팅 값은 대수 인코딩을 사용하여 ARGB32 텍스처에서 일반적으로 가능한 범위보다 더 확장된 동적 범위를 제공하기 위하여 암호화됩니다.

라이팅 모델은 Blinn-Phong에 고정됩니다.

카메라의 근접 평면을 지나지 않는 점과 집중 조명은 장면(scene)에 대한 Z buffer test 가 허용된 상태로 3D 형태로 랜더링 됩니다. 이것은 부분적으로 혹은 전적으로 가려진 점이나 집중조명을 랜더링 하기 아주 저렴하게 만들어 줍니다. 근접 평면을 가로지르는 방향성 라이트(Directional lights)와 점/집중조명(Point/Spot lights)은 풀 스크린 쿼즈로써 랜더링 됩니다.

만일 라이트의 그림자가 허용되면, 그 들 역시 이 패스에서 랜더링 되고 적용됩니다. 쉐도우는 "free"가 아님을 주의하십시오; 그림자 던지기(shadow casters)도 랜더링이 되어야 하고 좀더 복잡한 라이트 쉐이더가 적용되어야 합니다.

최종 패스

최종 패스는 최종 랜더링 이미지를 생산합니다. 여기서 모든 오브젝트는 다시 랜더링 됩니다; 쉐이더는 라이팅을 가져오고, 텍스처와 합하여 방사적인 라이팅을 추가합니다.

라이트맵은 역시 최종 패스에 적용됩니다. 카메라 가까이, 현실세계 라이팅이 사용되고 오직 bake 된 간접 라이팅만 추가 됩니다. 이것은 화면 겹치기(crossfades)로 완전히 bake 된 라이팅으로 카메라에서 멀어집니다.

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

Writing vertex and fragment shaders  (0) 2012.07.12
Blending  (0) 2012.06.25
Fallback  (0) 2012.05.21
RenderTech-VertexLit  (0) 2012.05.17
RenderTech-ForwardRendering  (0) 2012.05.17
Posted by 프리랜서 디자이너