Version: 2020.2
언어: 한국어
디퍼드 셰이딩 렌더링 경로
버텍스 릿 렌더링 경로

레거시 디퍼드 렌더링 경로

이 페이지에서는 Unity 빌트인 렌더 파이프라인의 레거시 디퍼드(광원 프리패스) 렌더링 경로에 대해 자세하게 설명합니다. 디퍼드 조명의 기술 개요는 이 문서를 참조하십시오.

참고: Unity 5.0 이후부터는 레거시 디퍼드 렌더링 경로가 레거시 기능으로 취급됩니다. 따라서 스탠다드 셰이더, 반사 프로브 등의 몇 가지 렌더링 기능을 지원하지 않습니다. 새 프로젝트의 경우 디퍼드 셰이딩 렌더링 경로를 대신 사용하는 것이 좋습니다.

참고: 직교 투사를 사용할 때는 디퍼드 렌더링이 지원되지 않습니다. 카메라의 투사 모드가 직교로 설정되어 있으면 카메라는 항상 포워드 렌더링을 사용합니다.

개요

디퍼드 라이팅을 사용할 경우 오브젝트에 영향을 줄 수 있는 광원의 수가 제한되지 않습니다. 모든 광원은 픽셀 단위로 계산되며 이는 모든 광원이 노멀 맵과 정확히 상호작용한다는 의미입니다. 또한 모든 광원은 쿠키와 섀도우를 가질 수 있습니다.

디퍼드 라이팅의 장점은 조명의 프로세싱 오버헤드가 광원이 비추는 픽셀의 수와 비례한다는 점입니다. 얼마나 많은 오브젝트를 비추는지와 무관하게 씬에 있는 광원 볼륨의 크기에 의해 결정됩니다. 따라서 광원을 작게 유지하면 성능이 향상됩니다. 또한 디퍼드 라이팅의 동작은 매우 일관성이 높으며 예측 가능합니다. 각 광원의 이펙트는 픽셀 단위로 계산되므로 큰 삼각형을 작게 나누는 데 드는 조명 계산이 필요 없습니다.

반면 단점으로는, 디퍼드 라이팅은 실질적으로 안티앨리어싱을 지원하지 않으며 반투명 오브젝트를 처리할 수 없습니다. 반투명 오브젝트는 포워드 렌더링을 사용하여 렌더링됩니다. 메시 렌더러의 섀도우 리시브 플래그도 지원하지 않으며 컬링 마스크는 제한적으로만 지원합니다. 최대 4개의 컬링 마스크만 사용할 수 있습니다. 즉, 컬링 레이어 마스크는 최소한 전체 레이어에서 네 개의 임의 레이어를 뺀 만큼을 포함해야 하며, 따라서 32개의 레이어 중 28개는 반드시 설정되어야 합니다. 그러지 않으면 그래픽 결함이 발생합니다.

요구 사항

Shader Model 3.0 버전 이상, 뎁스 렌더 텍스처, 양면 스텐실 버퍼 등을 지원하는 그래픽 카드가 필요합니다. GeForce FX 이후 버전, Radeon X1300 이후 버전, Intel 965/GMA X3100 이후 버전 등 2004년 이후에 출시된 대부분의 PC용 그래픽 카드가 디퍼드 라이팅을 지원합니다. 모바일에서는 모든 OpenGL ES 3.0 지원 GPU가 디퍼드 라이팅을 지원하며, 일부 OpenGL ES 2.0 지원 GPU(뎁스 텍스처를 지원하는 경우) 역시 지원합니다.

퍼포먼스 고려 사항

디퍼드 라이팅에서 실시간 광원의 렌더링 오버헤드는 광원이 비추는 픽셀 수에 비례하며, 씬 복잡도에 따라서 달라지지 않습니다. 따라서 작은 점 광원 또는 스폿 광원은 렌더링 비용이 낮으며 광원이 완전히 또는 부분적으로 씬 오브젝트에 의해 가려지는 경우 비용이 더욱 낮아집니다.

물론 섀도우가 있는 광원은 섀도우가 없는 경우보다 비용이 훨씬 많이 듭니다. 디퍼드 라이팅에서 섀도우를 캐스트하는 오브젝트는 섀도우를 캐스트하는 광원 각각에 대해 한 번 이상 렌더링해야 합니다. 뿐만 아니라, 섀도우를 적용하는 조명 셰이더는 섀도우가 비활성화된 경우에 비해 렌더링 오버헤드가 높습니다.

구현 세부 정보

디퍼드 라이팅을 사용하면 Unity에서의 렌더링 과정은 다음과 같이 세 가지 패스로 진행됩니다.

  1. 베이스 패스: 오브젝트가 뎁스, 노멀, 스페큘러 강도가 있는 스크린 공간 버퍼를 생성하도록 렌더링됩니다.
  2. 조명 패스: 다른 스크린 공간 버퍼에 조명을 계산하기 위해 이전에 생성한 버퍼를 사용합니다.
  3. 파이널 패스: 오브젝트가 다시 렌더링됩니다. 계산된 조명을 가져오고, 컬러 텍스처와 합성한 후 주변/이미시브 조명을 추가합니다.

디퍼드 라이팅을 처리할 수 없는 셰이더가 있는 오브젝트는 이 과정이 완료된 후 포워드 렌더링 경로를 사용하여 렌더링됩니다.

베이스 패스

베이스 패스에서는 각 오브젝트를 한 번씩 렌더링합니다. 뷰 공간 노멀과 스페큘러 강도는 하나의 ARGB32 렌더 텍스처에 렌더링됩니다(RGB 채널은 노멀, A 채널은 스페큘러 강도). 플랫폼 및 하드웨어를 통해 Z 버퍼를 텍스처로 읽을 수 있는 경우 뎁스는 명시적으로 렌더링되지 않습니다. Z 버퍼를 텍스처로 액세스할 수 없는 경우 뎁스는 셰이더 교체를 사용하여 추가 렌더링 패스에서 렌더링됩니다.

베이스 패스의 결과물은 씬의 콘텐츠가 담긴 Z 버퍼 및 노멀 맵과 스페큘러 강도를 포함하는 렌더 텍스처입니다.

조명 패스

조명 패스는 뎁스, 노멀, 스페큘러 강도를 기반으로 조명을 계산합니다. 조명은 스크린 공간에서 계산되기 때문에 처리에 걸리는 시간은 씬의 복잡성과 무관합니다. 조명 버퍼는 하나의 ARGB32 렌더 텍스처로, RGB 채널은 디퓨즈 조명, A 채널은 흑백 스페큘러 조명에 해당됩니다. 조명 값은 로그로 인코딩되어 ARGB32 텍스처에서 일반적으로 가능한 범위보다 더 넓은 동적 범위를 제공합니다. 카메라에 HDR 렌더링이 활성화되면 조명 버퍼는 ARGBHalf 포맷이 되며 로그의 인코딩은 수행되지 않습니다.

카메라의 근접 평면에 교차하지 않는 점 광원 및 스폿 광원 3D 형태(전면)로 렌더링되며, 씬에 대한 뎁스 테스트가 활성화됩니다. 근접 평면을 지나가는 광원 역시 3D 형태를 사용하여 렌더링되지만 대신 이 형태의 후면이 적용되며 역뎁스 테스트가 활성화됩니다. 이렇게 하면 일부 또는 전체가 가려지는 광원 렌더링은 비용이 매우 낮아집니다. 광원이 원거리 및 근접 카메라 평면 모두에 동시 교차하면 위의 최적화가 사용되지 않으며, 광원은 뎁스 테스트 없는 타이트한 사각형으로 그려집니다.

위의 내용은 항상 전체 화면 사각형으로 렌더링되는 방향 광원에는 적용되지 않습니다.

광원에 섀도우가 활성화된 경우 섀도우도 렌더링되고 이 패스에 적용됩니다. 섀도우를 렌더링하는 데도 리소스가 사용됩니다. 섀도우 캐스터를 렌더링하고 더 복잡한 광원 셰이더를 적용해야 하기 때문입니다.

사용 가능한 유일한 조명 모델은 블린 퐁입니다. 다른 모델을 사용하고 싶다면 조명 패스 셰이더를 수정하면 됩니다. 빌트인 셰이더에 있는 Internal-PrePassLighting.shader 파일의 수정 버전을 “Assets” 폴더 안의 “Resources” 폴더 안에 넣으십시오. 그 후 Edit->Project Settings->Graphics 창으로 이동하여 “레거시 디퍼드” 드롭다운을 “사용자 셰이더”로 변경해야 합니다. 그 후 나타나는 셰이더 옵션을 사용 중인 조명 셰이더로 변경해야 합니다.

파이널 패스

파이널 패스는 최종 렌더링 이미지를 생성합니다. 여기서 조명을 가져오는 셰이더와 함께 모든 오브젝트가 다시 렌더링되며, 이를 텍스처와 합치고 이미시브 조명이 있으면 추가합니다. 라이트맵 역시 파이널 패스에 추가됩니다. 카메라에 가까우면 실시간 조명이 사용되며 베이크된 간접 조명만 추가됩니다. 이는 카메라에서 멀리 떨어진 완전 베이크된 조명과 겹쳐집니다.

디퍼드 셰이딩 렌더링 경로
버텍스 릿 렌더링 경로