카메라와 컬링

Like Big·2022년 11월 27일
0

컬링

  • 컬링(Culling)의 사전적 의미는 '선별, 구별하여 골라낸다' 라는 의미
  • 카메라에 보이지 않는것은 그리지 않는다. 물체가 정지하더라도 매 프래임마다 그리기 때문에 안보이는 물체는 그리지 않는게 성능 향상이 됨
  • 그리지 않음으로 모델 렌더링 비용을 절약. 드로우콜, 쉐이더
  • 렌더링 입장 관련된 다루며 충돌이나 물리연산이랑은 관련이 없음

MVP 트랜스폼

  • 오브젝트가 화면에 보이고 이동을 표현하기 위해서는 최종적으로 화면, 즉 카메라에 어디에 오브젝트가 위치하는지를 표현해야함

  • 오브젝트를 구성하는 버텍스가 Model->View->Projection 공간 변환을 거치면서 최종적으로 2차원 모니터에 점으로 그려지게됨

  • 자세히 Model Space -(MW tr)> World Space -(WV tr)> Veiw Space -(VP tr)> Clip Space -> 화면 해상도에 맞게 픽셀 표현

  • URP Unlit 쉐이더 내용. positionWS(world space에서 바로 positionCS으로 변환(VS->CS아님)

  • 좌표 변환은 버텍스 쉐이더가 트랜스폼을 담당하며 행렬을 이용함

  • Model(Local/Object 다 같은말) Space : 물체의 피벗(중점)을 중심으로 공간으로 버텍스들이 어느 좌표에 위치하는지 나타낼 수 있음
  • mul은 행렬을 곱하는 함수

Perspective(원근)

  • 유니티 카메라는 디폴트로 Projection을 Perspective와 Orthographic 2가지 중 선택가능함.
  • View Spalce -> Clip Space로 Projection 변환시 원근감을 표현하기 위해 가까운 것은 버텍스끼리 멀게 표현하여 크게 보이게, 먼것은 버텍스끼리 가깝게 표현하여 작게 보이게하여 원근감을 제공하는것이 Perspective
  • Orthographic는 원근감이 없이 표현하며 Near, Far Clip Plane 과 상관없이 size에 따라 화면에 오브젝트의 크기가 변함

Frustum Culling

  • 카메라에서 Near Clip Plane이 카메라에서 가장 가까운 Clip, Far Clip Plane이 가장 먼 Clip으로 아래 프로스텀 뷰 영역을 벗어나는 오브젝트는 그리지 않는것이 Frustum Culling
  • 프러스텀 뷰(Frustum View)
    • 참고 : 줌인이나 줌아웃은 카메라를 가까이 멀리 움직이는 방식으로 조작
    • 프러스텀 뷰에 포함(OnBecameVisiable)/비포함(OnBecameInvisiable)시 이벤트 발생
  • 컬링은 오브젝트 기준으로 렌더러가 자르는게 아니며 CPU가 보통 체크(엔진기준)하며 GPU도 체크하기도함. 따라서 바닥같은 한덩어리의 오브젝트는 컬링되지 않는다

컬링

  • 보통 Near 보단 Far Clip Plane을 벗어나는 멀리있는 물체는 잘 보이지 않기 때문에 Far Clip Plane 거리를 짧게 하여 컬링하는 방법을 사용.
  • 그럴경우 오브젝트가 나타났다 없어졌다가 어색하므로 Fog의 끝을 Far Clip Plane이랑 거의 비슷하게 설정 (게임마다 CaseByCase)
  • 오픈월드처럼 평지에 멀리있는 것들을 볼 수 있는 프리뷰 보다, 탑 다운 뷰(위에서 아래를 바라봄) 방식을 활용하여 멀리 있는 오브젝트를 그리지 않는 방법을 모바일에서 많이 사용 (참고로 탑 다운뷰는 스카이박스를 불필요)

컬링 기준

  • 바운딩 박스, 바운딩 볼륨를 그리고 그것이 프로스텀 뷰에 들어오는지 안들어오는지 체크하여 조금이라도 들어오면 그림
  • 포함되는지, 비포함인지 컬링 체크를 매번 진행
  • 모든 오브젝트를 매번 컬링 체크하지 않고 공간분할(Spatial Partition)을 통해 공간을 먼저 컬링 체크하기 때문에 오브젝트 개수에 비례하여 컬링 시간이 걸리지 않음

    Octree(3D 공간을 쪼개면 8개가 생성되서), QuadTree(2공간을 쪼개면 4개가 생성되서)

Occulusion Culling

  • 가려지는 오브젝트는 그리지 않음
  • 유니티는 Umbra 솔루션을 사용
  • 인도어 환경에서 성능향상 효과를 보임. 필수

컬링 기준

  • 버텍스 TR 연산은 가려져있더라도 수행을 하며, 프래그먼트 쉐이더 정도만 스킵함.
  • 아마 Umbra 의 오클루전 컬링 원리가 Clip Space의 버텍스의 위치를 기준으로 가려짐이 있다 없다 파단하는 것으로 보임.
  • Occluder : 가리는 오브젝트로 대부분 정적 오브젝트. 동적인 오브젝트도 되지만 성능 이슈가 있어 보통 정적으로 세팅
  • Occludee : 가려지는 오브젝트로 정적, 동적인 오브젝트 모두 가능
  • 오클루전 컬링도 공간 분할을 사용하므로 Occlusion 윈도우에서 bake시 적정 숫자(Smallest Occluder, Smallest Hole)를 찾아야함
    • Umbra 의 기본 컴포넌트인 Occulsion Portal을 이용하여 포탈을 통해서 가려질지 말지를 플래그 처리를 할 수도 있음

Culling Layer

  • 컬링마스크를 사용하는 예시로 카메라가 여러개 있고 UI 따로그리고, 케릭터 따로그리고, 다른 카메라는 공간만 그리고 이렇게 카메라 스태킹을 기술을 사용할 때 그려야할 오브젝트의 레이어를 지정하여 그 레이어의 오브젝트만 그리게끔 할수 있다.

주의

  • 유니티는 컬링을 먼저하고 나서 레이어 필터링을 하게끔 구현 되어 있어 레이어가 나눠져있다해서 멀티카메라의 컬링비용이 줄어들지 않음. 왜이렇게 구현했을까..?
  • 카메라를 여러개 사용해야할 때는 시네머신을 추천함. 시네머신은 가상 카메라로 실제 카메라를 컨트롤 하는 역할 담당
  • 하지만 멀티카메라가 실제로 많이 사용해야하는 경우는 스태킹일 경우이며, 아래 그림과 같이 프로스텀 뷰에 오브젝트가 겹쳐지지 않게 배치하는게 팁
  • UI를 그리는 카메라도 동일한 원리

LOD(Level Of Detail) Culling

  • 디스턴스 컬링, LOD 컬링이라 부르며 실제로 컬링은 아니지만 LOD의 개념상 멀리떨어져 있으면 보이지 않게 하여 컬링과 비슷한 성능절약이 가능
profile
개고운(개발,고양이,운동)

0개의 댓글