카메라와 컬링

이관우·2023년 4월 18일
0

https://www.youtube.com/watch?v=O0qliGO7Oes

메쉬를 움직인다 = vertices를 움직인다

Vertex Transform
어떤 오브젝트가 카메라에 렌더링 되기 위해서 계산


비행기를 이루는 점들의 조합 -> 메쉬

오브젝트 자체의 공간이 있는거임 - Model/Local/Object Space
이걸 씬에 올리면 특정 위치로 이동하게 되는거
월드 기준의 공간 World Space - World Transform

눈으로 보는 건 카메라를 통해서 봄
즉 모든 오브젝트가 카메라 기준으로 정렬

월드 좌표 -> 카메라 기준 좌표 = View(camera) Space
즉 버텍스 쉐이더에서는 로컬 -> 월드 -> 뷰 Transform 을 거치고

3D -> 2D Clip Space로 변경 (Projection Transform)


멀리 있는 건 작게 - 원근법 등 -> Projection

Perspective (원근법) --
transform은 다 행렬 계산. 멀리 있는거 가까이 있는거 화면에 행렬 변환 과정


URP 쉐이더

positionOS -> objectSpace
positionCS -> ClipSpace

object Space를 World -> View -> Clip


SpaceTransforms

VP -> ViewProjection
결국 World -> View 변환 상수 행렬


유니티 기본제공 -> Frustum Culling

좌, 우 멀리 있는거 그릴지 말지

Far 값을 많이 크게 잡으면 멀리있는것도 다 그리게 되는 것
draw call이 높아짐
보통은 단면에 fog 처리를 한다.

  • ) culling 공간 드가고 나간거 event 있음

예전 탑다운 게임 - 적게 그리기 위함도 있음

컬링은 비용이 있긴함
2D 에서는 Quadtree(4개) 공간분할, 3D 에서는 Octree(8개) 공간분할

Frustum이 걸리는 공간 확인
오브젝트 이동이 많은 월드는 컬링 비용이 커질 수 있음
컬링이라는 개념은 기본적으로 cpu - 오브젝트가 그려질 대상인지 아닌지
화면 넘어가서 자르는 건 gpu - 렌더링 파트/파이프라인에서 하는거임


Frustum Culling은 유니티 기본
Occulusion Culling은 가려지는 건 그리지 않는 - 유니티에서는 엄브라 꺼를 사용

보통 indoor, fps에서 사용

이건 렌더링 관련이지, 업뎃이나 물리는 다른 내용


Occluder - 가리는 애. 대부분 정적인 애
Occludee - 가려지는 애.
성능 이슈로 보통 Occulder는 정적인 애 사용

여기서,
Occlusion 컬링을 위한 magic number 를 찾아야한다.

Occlusion Portal
문을 열면 보이고, 닫으면 안보여야하잖아
이런걸 Portal 이라 함.
동적으로 움직이는 occluder는 별로 그러나, 껐다 켰다 하는 개념임


Culling Mask
카메라가 여러 개일 때, 이 카메라는 UI만 그리고, 어떤 애는 캐릭터만 그리고
보통 Culling Mask라함은
유니티 -0> Culling 하고, Layer 필터링해서 렌더링함
즉, Culling을 먼저하기 때문에, Layer와는 상관 없음

이렇게 카메라가 여러 개일때는 Cinemachine 카메라를 추천함

Cinemachine 카메라 - 실제 카메라가 아니고, 가상의 카메라. cinemachine 자체가 컬링을 하진 않음

실제 카메라를 여러 개 써야하는 경우에는 Camera Stacking 사용
이럴 때는 가능한 비추는 공간을 겹치지 않게 하는 것을 권장

서로 Frustum이 겹치면 쓸데없는 연산이 생길 수 있음


멀리 떨어진 애들은 그리지 않는
LOD - Distance Culling 이라고도 하려나


profile
예이

0개의 댓글