애니메이터

Unity3D 5.X Lighting and Rendering - Precomputed Realtime GI 에 대한 나름 요약 본문

Game Engine/Unity3D

Unity3D 5.X Lighting and Rendering - Precomputed Realtime GI 에 대한 나름 요약

욤마핫 2017. 3. 12. 00:19
  1. Precomputed Realtime GI
    • 의미 : run time 상에서 Static geometry 의 간접조명(bounced light) 정보를 저장하고 플레이 할 수 있다. Baked GI 의 경우에는 Lightmap texture을 생성하고 프로젝트 안에 에셋으로 저장하기 때문에 변경, 수정될 수 없다. Precomputed GI는 Lightmap을 생성시키지 않고 Lighting Data Asset에다가 Lighting정보를 저장하고 낮은 해상도의 Lightmap을 run time 상의 변화에 맞춰 능동적으로 재생성할 수 있게 만들어 준다.


  2. Realtime Resolution
    • 리얼타임 해상도를 결정한다는것은 Texel 값을 결정한다는 것이다.
    • Texel : Texture pixels :  픽셀(pixel:화소)과 같이 컴퓨터그래픽의 기본 단위로 3차원 공간에서 만들어지는 그림인 텍스처(texture)의 색깔이 픽셀에 전해진 것이다.

    • 적절한 Texel 값은 플레이시 카메라에 얼만큼 복잡한 오브젝트에 의한 난반사가 있을지, 어느 정도까지 비추어질것인지에 따라서 다르게 결정해야 한다. (Unity1 유닛 = 1m 기준)
      • 복잡한 실내 : 2~3
      • 외부 : 1
      • 외부의 원경 : 0.5~1
      • Terrain : 0.1~0.5
    • 씬 전체 설정 값과 Static object 설정값을 따로 잡을 수 있다. - 최적화에 유용하게 쓰자.


  3. UnderStanding Charts
    • Chart가 뭐지?
      • 씬의 Objects 들의 lightmap용 UV를 펴는 영역
      • 각 Chart 들은 디폴트 값으로 최소 4X4 texel 의 크기를 가진다. - 따라서 Object의 크기와 상관없이 최소 16 Texel 이 쓰이게 된다.
      • 그리고 이 Chart들을 연결하고 붙여서 큰 사이즈의 lightmap UV가 완성이 된다.
    • 기본 Chart 의 모습
      • 위와 같은 UV Chart가 오브젝트별로 생성이 되고 이것들을 죄다 연결하여 Scene에 적용할 Lightmap Texture가 생성된다고 보면 되겠다.


  4. Starting the Precompute process
    • Precompute Realtime GI를 적용하기 위해서는 적어도 하나의 Lightmap Static Object가 존재하여야 한다.
    • Window/Lighting 으로 라이팅 관련 윈도우를 꺼내고 Scene 탭에서 Auto Check가 되어 있는지 확인한다.
      • 백그라운드에서 위의 그림과 같이 계속 연산 중임을 나타내 준다.
      • Precomputed Realtime GI 에서는 Auto를 켜 놓는 것을 추천한다.


  5. Probe lighting
    • Probe Lighting 이란?
      •  
      • 그림과 같은 구체에 그 위치의 Lighting 정보를 가지고 해당 영역만을 연산해서 Non-Static Object에 적용해주는 방법, 기술적 내용은 생략
    • Probe Lighting을 적용할 Objects 선정
      • 왜 Probe Lighting을 쓰는가 : 앞서 설명한 Chart 를 생성시켜서 Lightmap을 만드는 것 보다 가볍기 때문이다.
      • 상대적으로 작은 Object들에 쓴다. : Lightmap 연산은 가중 시키지만 실질적으로 전체 화면 퀄러티에 대한 영향이 적은 크기가 작은 Object 들에 쓴다.
      •  이 와 같은 배경의 돌맹이 등.
    • Probe의 배치
      • 씬에서 Light가 급격히 변하는 지점
      • 바닥에는 닿지 않게 하고 바닥에서 하늘로 올라갈 수로 적게 배치 (0m, 1m, 2m, 5m 등)
      • 유저가 움직일 수 있는 부분은 조밀하게, 못 가는 영역은 성글게 배치
      • 한번에 다 하기 어려울경우 몇 가지 그룹으로 나누어도 상관없음
      • 왜 Probe를 쓰느냐는 꼭 기억해야 한다. Chart 갯수를 줄이기 위해서.


  6. Unwrapping and Chart reduction
    • Chart 의 Unwrapping
      • Auto UV Unwrapping 으로 UV를 펴 준다. 
      • 위의 옵션에 따라서 UV가 자동으로 펴지는데
      • UV 가 seam이 떨어져 있으면 그 갯수 만큼 Chart가 생성됨, 아래 그림에서는 seam이 전부 떨어져 있으므로 Chart가 6개
      • 최대한 옵션값을 조정해서 UV가 찌그러지거나 seam이 떨어지지 않게 만들어 주는것이 포인트.
      • 그렇다면, 이미 만들어 놓은 UV를 쓰면 되지 않느냐? - 아래에 설명함 (Preserve UV)
    • Preserve UV
      • 이 옵션은 Object의 UV01번 채널의 UV 데이터를 그대로 쓴다.
      • 하지만, 전체 Lightmap에 어울리기 작업이 되어 있지는 않기 때문에 사용을 자제할 것을 추천함
      • Chart들을 전부 역어서 큰 Lightmap을 만든다고 이미 Chart 초반에 설명을 하였음, 그런데 몇몇 Object들의 UV Chart가 삐죽하거나 비틀어져 있거나 하면 큰 Lightmap에 맞춰 넣기가 곤란해지기 때문
    • 복잡한 Scene 에서 Chart 편집하기
      • 복잡한 씬에서 직접 Chart를 편집하는것 보다는 각 오브젝트들을 Copy 하고 새로운 씬을 열고 Paste 한후 깨끗한 씬에서 작업하고 Mesh Renderer Component를 copy 한후 본래의 씬으로 돌아와서 Mesh RendererComponent 에 Paste Component Values를 하면 완료.
    • 적절한 Auto UV 값을 찾기
      • 위에서 설명한 것 처럼 오브젝트를 하나 copy 해서 새로운 씬에 넣고 작업을 해준다.
      • Auto UV Max Distance를 0.8로 적용하면 아래와 같이 나뉘어 진다.
      • 옆면의 UV가 늘어지는 현상이 없어졌다.
      • Auto UV Max Angle을 0으로 낮춰보면
      • UV 가 늘어지는 현상은 없지만 너무 잘게 나뉘어 진다.
      • 적절하게 93 정도로 올리면 다시 적절히 잘 나뉘어 진다.
      • Inspector 창의로 가서 하단의 Preview를 보면 선택한 Object의 UV Chart가 어떻게 펴져 있는지 확인 할 수 있다.
    • Unwrap을 프리팹 별로 적용할 것인가? 아니면 개개 오브젝트 별로 적용할 것인가?
      • 물론 Prefab에 Chart가 저장이 됨은 물론이고 같은 Prefab을 복사하였더라도 씬에서 유저가 접근하기 어려운 먼곳에 위치 한다거나 한다면 개별적으로 Chart를 만들어 적용해 주는 것이 Performence에 도움이 된다.


  7. Understanding Clusters
    • Cluster!는 또 뭡니까?
      • 유니티가 Lightmap을 계산할때 전체 픽셀, Mesh Object들을 하나하나 계산하기는 너무 힘드니 좀 더 연산을 간단하고 빠르게 하기 위해서 Static Object 에 대해서 Voxel화 한 표면 영역. (Voxel : 복셀이라고 하면 3D 그래픽에서 유행하는 형태로 말하자면 마인크래프트 같은 것이지만 여기서는 좀 더 근본적인 의미로 계산을 하기 위한 최소 단위인 사각 패치정도로 생각하면 되겠다, 마인크래프트도 정육각형의 최소단위만을 쌓아 올려서 뭔가를 만들죠)
      • 그래서 Cluster 보기로 씬을 보게 되면 아래와 같이 Object 들에게 타일맵을 한  것 처럼 볼 수 있다.(Terrain은 큰 패치로, 마을은 작은 패치로 되어 있는 것을 확인할 수 있죠)
      • 그래서 각각의 패치들은 Light를 계산할때(유니티의 Light 연산 과정중 "Light Transport" 에서) 서로 영향을 주고 받으며 계산을 하게 된다. 아래 이미지에서 X 부분의 Light 계산을 할 경우에 A, B, C 와 검정 클러스터의 영향을 받아 다음과 같은 색상을 얻게 된다.
      • Chart 와 마찮가지로 Cluster도 갯수를 줄이면 줄일 수록 연산이 빨라진다.


  8. Fine tunning with Lightmap Parameters
    • Advanced Lightmapping Controls
      • Lightmap Parameters
      • Project Window에서 Create/Lightmap Parameters 로 생성, 또는 풀다운 메뉴 Asset/Create/Lightmap Parameters 로 생성
      •  or 

      • 생성한 Lightmap Parameter를 최적화 컨셉에 맞게 설정 한 후 적당한 이름으로 바꾸고 아래 이미지에서 처럼 Lighting/Object로 들어가 Static Object의 Mesh Renderer component에서 Advanced Parameters에 적용하면 된다. Inspector 창에서는 지원되지 않음
      • 개별 Object에 적용을 하지 않았다면 "Default Scene Parameters"가 씬 전체 Object에 적용이 되어 있는 상태이다.
      • 좀 더 편집을 해서 최적화를 하고 싶다면 "Edit" 버튼을 눌러서 옵션 창을 띄우자.
      • Unity 에서 이미 적절한 세팅 값 4가지를 잡아 두었다. 이것을 적당히 골라서 써도 된다. (각 옵션 값은 아래 그림을 참조)
        • Default - HighResolution
        • Default - Medium
        • Default - LowResolution
        • Default - VeryLowResolution
        • Resolution : Light/Scene 탭의 Resolution 에 이 값을 곱하여 Object에 적용될 Texel 값을 산출한다. Scene 값이 2 이고 이 값이 0.5 이면 최종적으로 적용되는 Texel 값은 1이된다.
        • Cluster Resolution : Texel 안에 몇개의 Cluster를 넣을 것인지 결정한다. 최대 값은 1 이다. 즉, 1Texel 안에 들어갈 수 있는 Cluster은 최대 1개이다. 
          • 0.5 라고 한다면 2 Texel 에 1개의 Cluster가 들어가게 되므로 Cluster의 크기는 두배로 커지게 된다. 
          • Scene 탭의 Realtime Resolution 값과 맞 물려서 돌아가는 것을 생각해 본자.
            • Realtime Resolution 값이 2 이고 Cluster Resolution 값이 0.5 이면 1m 단위 큐브 Object에는 몇개의 Cluster가 생기겠는가? 
            • Realtime Resolution 값이 2 이고 Cluster Resolution 값이 1 이면 1m 단위 큐브 Object에는 몇개의 Cluster가 생기겠는가? 
        • Irradiance Budget : Texel의 Cluster 값을 연산할때 메모리를 얼마나 부여할 것인가에 대한 수치, 낮으면 뭉게짐이 심해지고 높으면 좀 더 정확한 결과를 나타낸다. 연산 속도도 그에 비례해서 증가한다. 하지만, 전반적으로 품질 기여도는 낮기 때문에 연산속도에 문제가 있다면 먼저 이 값을 낮추어 본다.
        • Irradiance Quality : 각 Texel이 쏠 수 있는 Ray의 값, 간간이 Light가 잘 못 계산되어 예상되는 결과값과 다르게 갑자기 튀는 밝은 부분 같은 것이 눈에 띄인다면 이 값을 높여 본다.
        • Modelling Tolerance : geometry 들이 밀접해 있는 지역, 주로 바닥과 오브젝트간 사이 처럼 틈이 너무 작아서 Ray가 들어갈 수 없는 부분에서 어두운 부분이 가두리 양식장 처럼 갇혀 보이는 현상이 있을때 이 값을 조정하여 해결한다. 아래 그림을 참고.
        •  
    • Building our Lightmap Parameters assets
      • Project 창에서 Create/Lightmap Prameters 로 새로운 Lightmap Parameters를 만들고 이름을 TutorialTerrainLow 로 만들어준다.
      • 위와 같은 씬에서 Terrain에 적용할 예정이다. Terrain이 Static 인지 확인!
      • Window/Lighting 에서 Scene 탭을 열고 Auto 모드를 켜자.
      • Object 탭을 열고 Advanced Parameter 메뉴를 클릭하여 위에서 만들어 놓은 TutorialTerrainLow 를 선택하고 edit 버튼을 클릭하면 아래와 같은 설정 창이 나온다.
      • 현 설정에서 Chart 의 배치를 보면 다음과 같다. 저 자잘한 체크 무늬가 Chart 기본 단위인데 이 원경에 이정도의 Chart가 필요하지 않다.
      •  Resolution을 낮추자. 1 -> 0.05
      • 적당한 배치인 것 같다.
      • Cluster Resolution 0.4 앞에서 설명한 것과 같이 Cluster Resolution 값은 낮추면 Cluster가 더 커지고 높이면 작아진다. 적절한 값을 찾자.
      • Lit Cluster Mode : Scene 화면에서 아래 체크 항목을 누르면 여러가지 현재 상황을 그래픽 적으로 알려준다. 이중에 Lit Cluster 모드는 현재 세팅에서 라이트가 어떤 부분이 치명적으로 잘 못 표현 되어 있나를 대략적으로 확인 할 수 있게 해준다. 적절히 확인하면서 Cluster Resolution 값을 조정해 주자.
      • Cluster Resolution : 0.4
      • Cluster Resolution : 0.248 (값을 너무 낮췄더니 산 꼭대기 부분이 많이 깨지게 나왔다.)
      •  
      • 적정 값으로 0.4를 쓰자.
      • Irradiance Budget : 각 Texel 에 배당되는 메모리 양을 조절해 준다. GI 계산이 끝나고 결과물을 확인 했을때 특정 부분에서 (보통은 콘트라스트가 큰 지역) 너무 부드럽거나 불 분명하게 표현이 된다면 이 수치를 올려주는것이 좋다.
      • Irradiance Quality : 수치를 낮출 수록 Sharpness가 내려간다. 이 정도의 원경에서는 2048가 적정값
      • 이렇게 각 오브젝트를 전부 할 필요는 없지만 적정하게 수치들을 조절해 주면 라이팅 연산에 시간이 많이 절약이 되겠다.
  9. Summary
    • 전체 씬 제작 후 씬을 둘러보며 계획 세우기
    • Chart 의 수를 줄이는 것이 퍼포먼스를 위해서 가장 중요함
    • 라이트 프로브 설치
    • Cluster가 어떻게 배치되어 있는지 확인 및 Cluster 줄이기
    • Lightmap Parameter 조정으로 세부 조절하기