Probe lighting – 번역

Probe lighting

원문 링크

 

이전글 – Staring the precompute process

Probe lighting

확인 완료한 버전: 5.5 – 난이도: 중급

챠트(Chart)의 수가 라이팅을 계산하는 시간에 악영향을 미친다는 점을 살펴봤으므로, 라이팅 계산 과정에서 특정 오브젝트를 제외시켜서 라이팅 성능의 이득을 볼 수 있습니다. 라이팅 계산에서 오브젝트를 제거하면 생성되는 챠트의 수가 감소합니다. 이렇게 라이팅 계산과정에서 제거한 오브젝트에 대해서, 씬에서 간접광(indirect lighting)을 처리하는데 효율적인 프로브 라이팅(Probe Lighting)을 사용할 수 있습니다. 프로브 라이트가 적용된 오브젝트는 씬에 반사광을 제공하지는 않지만, 이로인한 영향은 거의 눈에띄지 않는 수준입니다. 크기가 작은 오브젝트 일수록 반사광에 영향을 거의 받지 않기 때문에 프로브 라이팅에 적합합니다.

 

프로브 라이팅이 뭔가요? (What is probe lighting?)

프로브 라이팅은 게임과 같은 실시간 렌더링 어플리케이션에서 라이팅(빛 계산)을 대략적으로 계산하는 빠른 기술을 말합니다. 프로브 라이팅은, 게임 세계에서 빛을 받는 캐릭터와 움직이는(다이나믹) 오브젝트에 많이 사용됩니다. 프로브 라이팅은 런타임에서 성능이 매우 좋고, 미리 계산하는 시간이 빠르다는 장점이 있습니다.

프로브 라이팅은 3차원 공간에서 특정 위치에 들어오는 빛을 샘플링하는 방식으로 동작하며 구면 조화(spherical harmonics)라고 알려진 수학 함수를 이용해서 구체(sphere)를 통해서 이 정보를 인코딩합니다. 이러한 계수(coefficients)는 저장 비용이 낮고 게임 플레이 시에 정보가 빠르게 변환될 수 있기때문에, 쉐이더(shader)에서 씬 안의 표면 빛을 근사시키기 위해서 사용합니다. 유니티에서는 라이트 프로브(Light Probe)를 통해서 이 기능을 제공합니다.

프로브 라이팅을 사용하는데는 제약이 따릅니다. 이런 제약 중 하나는 고주파(high frequency) 빛과, 이 특별한 숫자의 수준(크기)를 증가시키지 않고 구체의 범위에 걸친 얼룩덜룩한 빛을 표현하기 어렵다는 점입니다. 불행하게도 정밀도가 높아짐에 따라서 비용이 급격하게 증가하기 때문에, 낮은 수준의 구면 조화함수의 사용에만 국한됩니다.

게임 세계에서 하나의 3차원 위치에는, 그 위치의 라이팅에 대해서 하나의 구면 표현(spherical representation)만 존재하기 때문에, 매우 다양한 빛 표현을 필요로하는 아주 큰 오브젝트에 대한 빛 처리에는 프로브 라이팅이 적합하지 않습니다. 또다른 제약은 구면 조화 함수는 빛을 처리한 값들을 구체로 저장하기 때문에 큰 평면 오브젝트나 상당히 오목한 부분을 가진 오브젝트에는 대체로 적합하지 않다는 것입니다. 크기가 큰 오브젝트에 프로브 라이팅의 사용을 고려하는 경우, Light Probe Proxy Volumes (LPPV)에 대한 유니티 메뉴얼을 참고하시기 바랍니다.

이러한 제약사항이 있음에도, 적절하게 작고, 볼록한 오브젝트에 프로브 라이팅이 사용되면 비교적 낮은 비용으로 적절하게 만족할만한 수준의 결과를 얻을 수 있습니다. 이 글의 뒷부분에서 라이트 프로브의 배치와 설정방법에 대해서 더 자세하게 살펴볼 예정입니다. 하지만 지금은, 적절한 곳에서 프로브 라이트를 사용하면 씬에서 라이트맵 챠트의 수를 줄일 수 있다는 것만 이해하면 됩니다.

 

프로브로 라이팅을 적용할 오브젝트 선택하기 (Choosing objects to light with probes)

라이팅 설정 과정에서 Environment 그룹 아래에 있는 게임오브젝트들을 Static으로 설정하는 것이 대부분 유용한 반면, Environment 게임오브젝트 아래에는 프로브 라이팅을 사용하기에 적합한 게임오브젝트들도 많습니다. 이런 오브젝트에 대해서 Static flag를 해제하면, 더이상 유니티의 미리 계산된 실시간 GI(Precomputed Realtime GI) 시스템에 의해서 처리되지 않기 때문에, 라이트맵 챠트(lightmap chart)의 수가 줄어듭니다. 씬에서 챠트의 수를 줄이는 것이 라이팅을 미리 계산하는 과정에서 걸리는 시간을 줄이는데 핵심이라는 것을 명심하시기 바랍니다.

probelighting
프로브 라이팅에 가장 적합한, 작고 볼록한 오브젝트.

유니티 에디터의 계층 뷰(Hierarchy View)에서 Environment 게임오브젝트의 자식 오브젝트를 살펴보겠습니다. 자세히 살펴보면, Props 게임오브젝트 아래에 위치한 오브젝트들을 찾을 수 있습니다. 이 오브젝트들 중에서 다수는 물통, 나무 널판지, 바위 등과 같이 작고, 씬을 꾸미는데 사용되는 오브젝트인 것을 확인할 수 있습니다. 이런 오브젝트들은 수가 많고, 이들 중 다수는 상당히 작아서 UV를 unwrap하기 까다로운 오브젝트 입니다. 왜곡이 없는 라이트맵 UV를 얻는 과정에서 다수의 UV 찌꺼기가 생성될 수 있습니다. UV 찌꺼기가 더 많이 생성되면, 불필요한 챠트가 추가되고, 챠트의 수가 증가하면 계산해야하는 라이트맵 텍셀의 수가 증가하는 악순환이 반복됩니다.

이런 오브젝트들은 매우 작기 때문에, 씬에서 간접광에 크게 영향을 받지않을 가능성이 높습니다. 그와 동시에, 크기가 작다는 것은 다양하고 세부적인 라이팅을 표현할 수 있는 표면의 면적이 매우 작다는 것을 의미합니다. 이런 오브젝트들은 프로브 라이팅을 사용하기에 적합한 오브젝트 입니다. 이때 프로브 라이트를 사용하면, 메모리에 저장해야하는 라이트맵과 쉐이더에서 해석해야하는 라이트맵의 수가 줄어들기 때문에 라이팅을 미리 계산하는 시간이 줄어들고 런타임에서 성능이 향상됩니다.

  • 계층 뷰에서 Props 게임오브젝트를 선택합니다.
  • 인스펙터뷰에서 Static 체크박스를 체크 해제합니다.
  • 자식오브젝트에 대해서 묻는 창이 나타나면, Yes를 선택합니다.

이 시점에서 라이팅을 미리 계산하는 과정을 충분히 오래 두면, 작업이 완료된 후 씬 뷰에서 라이팅의 결과를 확인할 수 있습니다. 프로브 라이트가 적용된 non-Static 오브젝트는 그 주변의 오브젝트에 대해서 빛 처리결과가 다르다는 것과 씬의 다른 라이팅 결과와 어울리지 않는다는 것을 확인할 수 있습니다. 이는 아직 라이트 프로브를 설정하지 않았기 때문에 이 오브젝트들(프로브 라이트가 적용된 non-Static 오브젝트)은 씬의 앰비언트 프로브(Ambient Probe)로 돌아갑니다. 앰비언트 프로브는 기본적으로 씬에서 감춰져있고, 사용자에게 보이지 않으며, Lighting 창에서 Ambient Source 세트만 샘플링 합니다.

ambientprobe
라이트 프로브를 설정하지 않으면, non-Static 오브젝트가 그 주변의 환경에서 얼마나 동떨어져 보일 수 있는지를 보여주는 그림.

Non-Static 오브젝트가 주변의 빛에 좀 더 어울리도록 배치하기 위해서는, 게임 세계에 걸친 간접광에 대한 정보를 수집할 수 있도록, 시간을 들여서 라이트 프로브(Light Probe)를 배치해야 합니다.

 

 

라이트 프로브 배치하기 (Placing Light Probes)

Non-Static 오브젝트는 근처의 프로브에서 근사치를 기반으로 빛을 받습니다. 특정 오브젝트에서 어떤 프로브로부터 빛 데이터를 ‘읽어올지’ 여부는 사면체에 있는 라이트 프로브들 사이의 공간을 나눈 값에 의해서 결정됩니다. 그런 다음 해당 오브젝트가위치하는 사면체가 어딘지 확인합니다. 이런 사면체를 구성하기 위해서는, 3차원 볼륨(Volume)이 구성될 수 있도록 프로브를 배치해야 합니다.

probevisualisation
라이트 프로브의 배치를 보여주는 씬 – lit sphere를 볼 수 있도록 설정된 에디터.

프로브 라이팅은 런타임에서 상대적으로 비용이 저렴하고 라이팅을 미리 계산하는데 걸리는 시간이 짧습니다. 하지만, 성능을 최대화시키기 위해서는 프로브를 배치할때 신경 써줘야하는 부분이 있습니다. 빠르게 설정할 수 있지만, 라이트 프로브의 그리드를 너무 세밀하게 배치하면, 로컬 라이팅 조건에서 빛의 변화의 대한 데이터를 그리 많이 포착하지 못하기 때문에 잠재적으로 낭비가 될 수 있습니다. 효율을 위해서, 라이팅이 뚜렷하게 변하는 영역에서 프로브를 더 세밀하게 배치하는 것이 좋습니다. 이런 영역에는 예를 들어, 빛에서 그림자로 변하는 지점이나 빛의 반사에 의해서 강한 색상이 나타나는 영역을 포함시킬 수 있습니다.

  • 라이트 프로브를 설정하기 위해서, 게임오브젝트 메뉴에서 라이트 프로브 그룹을 생성합니다 (GameObject > Light > Light Probe Group).
  • 이제 프로브를 배치합니다. 계층 뷰에서 새로 생성된 라이트 프로브 그룹을 선택합니다.
  • 인스펙터뷰에서, Light Probe Group 컴포넌트의 Edit Light Probe를 선택합니다.
  • 이제 씬 뷰에서 해당 프로브를 선택할 수 있습니다. 기본 큐브 모양으로 배치된 프로브에서 현재 선택된, 모퉁이의 프로브 하나를 제외하고 나머지는 모두 삭제합니다.
  • 삭제하고 남은 프로브를 지형(Terrain, 바닥면) 바로 위에 위치시킨 다음, Ctrl+D(Cmd+D on Mac)키를 눌러서 복제합니다.
  • 이동 툴(W)을 이용해서, 복제된 두번째 프로브를 첫번째 프로브와 대략 2미터정도 거리로 Y축으로 이동시킵니다.
  • 이제 프로브를 다시 복제하고, 새로 복제된 프로브를 이전 프로브와 대략 5미터정도 Y축으로 이동시킵니다.

lightprobegroup
LightProbe Group 컴포넌트에 있는 Edit Light Probes 버튼.

이렇게 세로로 배치하는 이유는 바닥에서, 머리 높이에서, 그리고 공중에서 반사되는 간접광을 샘플링하기 위해서 입니다(오브젝트가 바닥에서 위로 이동하는 상황이 발생할 수 있습니다). 씬 에서 이 라이트 프로브를 복사해서 볼륨을 만들때는, 플레이 가능한 모든 오브젝트가 라이트 프로브로 구성된 사면체 안에 위치하도록 해야합니다. 프로브 사이를 자홍색(마젠타) 실선으로 연결해서이 볼륨을 표현합니다.

tetrahedrons
라이트 프로브의 위치와 라이트 프로브로 구성된 사면체를 보여주는 이미지.

  • Shift를 누른 생태에서 마우스 클릭을 이용해서 개별 선택하거나, 드래그를 이용해서 방금 생성한 3개의 프로브를 선택합니다.
  • 세로로 배치한 프로브 전체를 복제해서 근처 위치에서 라이트 정보를 수집할 위치로 복제한 프로브를 이동시킵니다.

라이트 정보를 수집할 위치를 결정할때는, 그림자 영역을 찾아보거나, 지형 재질에서 색상이 뚜렷하게 변하는 영역으로 결정할 수 있습니다. 씬 전체의 빛 중에서 반사광과 간접광을 찾고있다는 점을 명심합니다. 프로브를 새로 추가하는 비용이 의미가 있으려면, 프로브가 배치되는 위치에 빛의 변화가 뚜렷해야 합니다. 만약 라이트 프로브를 일반적이거나 일정한 빛을 나타내는 영역을 샘플링하는데 사용하는 경우, 빛을 받는 오브젝트가 이 프로브를 지날때 변화를 크게 느끼지 못하게 됩니다. 게임 최적화의 다른 많은 측면들처럼, 모든 개체가 씬에 포함되므로써 이득을 제공하도록 해야합니다.

  • 프로브를 라이팅의 변화가 있는 영역에 보다 높은 밀도로 배치해서, 플레이할 수 있는 영역을 감싸는 넓은 레이아웃을 만들때까지 이 과정을 반복합니다.
  • 프로브를 배치하는 동안에는, 가장 기본적으로 라이트 프로브를 지면에서 살짝 떨어지도록 배치해야한다는 점을 명심합니다.

LightingTutorialOptimal 예제 씬에서 두 그룹의 라이트 프로브를 생성했습니다: 하나는 마을 주면에 밀도가 좀 더 높게 배치된, VillageLightProbeGroup이라 불리는 라이트 프로브이고, 다른 하나는 마을 밖에 플레이할 수 없는, 넓은 지역에 배치된, ExtentsLightProbeGroup이라 불리는 라이트 프로브입니다. 두번째 그룹은 non-Static MeshRenderer가 플레이할 수 있는 영역을 벗어나는 경우를 대비해서 게임 세계의 넓은 영역을 담당합니다. 씬에서 이렇게 도달할 수 없는 부분에 대해서는 동일한 밀도로 프로브를 배치할 필요가 없기때문에, 훨씬 낮은 밀도로 배치할 수 있습니다. 세로축으로 2개의 프로브를 배치하는 것으로 충분합니다.

프로브 그룹(Probe Group)을 두 개의 게임오브젝트로 분리하면 프로브의 배치를 쉽게하는데 도움이 됩니다. 씬에서 프로브가 동작할 때 좀 더 뚜렷한 효과를 나타내기 위해서, 개별 라이트 프로브 그룹을 각각 활성화시키거나 비활성화시킬 수 있습니다. 이 그룹은 런타임에 중복되는 프로브를 제거하는 과정과 함께, 자동으로 결합됩니다.

주변 환경에 따라서 라이트 프로브에 의한 빛 효과를 확인하려면, 라이팅을 미리 계산하는 과정이 완료될 때까지 기다려야 합니다. Lighting 창에서 Auto 모드가 활성화된 경우, 이 과정은 자동으로 진행됩니다. Auto 모드가 비활성화된 경우에는, Lighting 창(Window > Lighting)에서 Build 버튼을 눌러서 라이팅을 미리 계산하는 과정을 수동으로 시작시켜야 합니다.

이 프로세스가 완료되면, 씬의 non-Static 게임오브젝트가 라이트 프로브로부터 빛 정보를 읽어와 씬 라이팅과 좀 더 어울리는 효과를 구성하는 것을 확인할 수 있습니다. 라이트 프로브의 빛 효과를 확인하기 위해서는 계층뷰(Hierarchy View)에서 해당 라이트 프로브 그룹의 선택을 해제 합니다.

이제 씬에 라이트 프로브의 설정을 통해서, 라이팅을 미리 계산하는 과정에 작은 오브젝트를 추가하는 것으로 인해서 불필요한 챠트(Chart)가 생성되는 문제없이, 작은 ‘prop’ 오브젝트에 간접광의 시각적 효과를 얻었습니다.

 

내용 끝까지 읽어주셔서 감사합니다.

배너 클릭은 저에게 많은 힘이 됩니다.

감사합니다 🙂

 

다음글 – Unwrapping and Chart reduction

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, 웹 개발, 1인 기업, 독서, 책쓰기에 관심이 많습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다