Graphic
Unreal Engine Rendering Pipeline
공부 목적
다른 플랫폼에서 렌더링 파이프라인을 적용시키는 난이도가 훨씬 수월하다.
언리얼 엔진에서는 렌더링 파이프 라인 각 단계에서 어느정도의 포퍼먼스를 할당되었는가
하는 모니터 도구를 제공한다.
ctrl + shift + ,
키를 눌러 볼 수 있으며, Fog 나 레벨에 올려진 Actor 등 환경에 따라 바뀐다.
각 단계는 통합되거나 추가될 수도 있으나, 하지만 어느정도 진행 단계는 꼭 수행된다. ( 큰 틀은 바뀌지 않는다. )
Scene 이 다르면 해당 단계의 연산량 비중도 달라지게 된다.
보통은 Shadow 와 BasePass 와, Lighting , 반투명 부분, PostProcess 부분에서 비용이 많이 높다.
언리얼 엔더링 파이프라인1
한 프레임이 시작할때 , 클리어 작업 이 수행된다.
이전에 사용되었던 버퍼나, 화면 값등을 비워주는 작업을 한다.
파티클 이펙트 같은 것이 있다면, 우선 시뮬레이션을 돌려 위치나 속도값 같은 것을
미리 계산하여 나중에 사용한다.
-
PrePass DDM_AllOpaqueue (Forced by Diffuse) (불투명 프리 패스)
-
불투명 물체들만 먼쪽부터 가까운쪽 순서로
Depth 계산을 수행한다.
이때 계산된 버퍼를 여러 군데에서 사용한다.
-
ComputeLightGrid (라이트 영역 할당과 계산)
-
3차원 공간을 큐브형태로, 그리드로 나누어서 계산을 한다.
깊이가 깊어질수록, 심도가 깊어지면 큐브가 깊게, 많이 생성이 된다.
그럴수록 계산량이 커지는 것이다. 깊이가 낮다면 계산적으로 유리한 부분이 있다.
이러한 정보들은 나중에 볼륨포그 등, 볼륨 형태의 안개나 (이런 안개는 빛을 산란 시키기도 하고) 그런 것들이 있는데,
그런것을 연산할 때도 이런 정보가 이용이 된다.
3번으로 가는 중간에 Scene depth 라고 해서, 화면의 깊이 정보를 한번 정렬을 수행한다.
-
BeginOcclusionTest (차폐 테스트)
-
Mesh 들이 배치가 되어있으면, 이전 Pass 에서 depth 가 계산되었다면,
Mesh 가 Mesh 에 의해 가려지는 부분 (반투명이나 불투명 모두) 을 모두 추출을 하고
나중에 그것을 그릴까 그리지 않을까 하는 부분을 계산하는 단계이다.
상당히 무겁다.
오브젝트들이 많을수록, 오브젝트가 많이 겹칠수록 무거워진다.
흔히 병목이 많이 일어나는 지점이다.
게다가 이 시점에서 나중에 조명계산을 할때 필요없는 부분을 한번 걸러낸다.
-
BuildHZB(ViewId-0) ( Hi-z 버퍼 )
-
먼저 계산된 깊이값을 mip chain 이라고 해서 , 텍스쳐를 디테일한것 한장, 덜 디테일한것 ( mip map 관련)
등 4단계정도 chain 으로 만들어 놓는다.
-
ShadowDepth(쉐도우 뎁스)
-
그림자 계산을 수행한다.
엄청나게 무거운 작업이다. 반투명물체의 그림자 계산이라면 더더욱 무겁다.
Lightmap 계산이라고 해서, Stationalry , Movable 을 고려하는 굉장히 복잡한 단계이다.
Volume Fog 에 의한 빛의 산란 및 빛의 감쇠에 대한 버퍼도 만들고,
그 전단계 버퍼들을 사용해서 GI 라이트 와 통합을 해서 그것을 또 Fog 영역에 저장을 하는 단계를 거치기도 한다.
-
CompositionBeforeBasePass (베이스 페스 전 과정 구성)
-
기존 결과들을 정리하고, Decal 같은것도 연산하는 단계.
언리얼 렌더링 파이프라인 2
-
BasePass ( 베이스 패스 )
-
기본적인 렌더링 패스의 가장 큰 부분이다.
물체가 많을수록 굉장히 큰 연산량을 차지하게 된다.
이전 패스에서는 깊이나 차폐 등의 내용을 계산했다면,
이단계에서 부터 재질과 색상에 대한 계산이 들어간다.
조명계산이나 음영등의 계산시 생상과의 중첩이 일어날 수 있기 때문에
이를 막기 위해 속성에 대해 미리 캐싱을 수행하고,
그 과정에서 sky 등을 렌더링 하기 시작한다.
모바일 같은 Forward Rendering 의 경우 이를 원할하게 하기 위해서
뭔가 가지고 있는 버퍼가 따로 없다. Defferred 에 있다.
같은 모바일이라고 해도, 타겟 목표 api 가 openGL 버젼에 따라 차이가 있다.
어쨌든 이 단계에서, 컬러계산, 조명 적용, Normal 계산, 버퍼시각화에 표시되는 여러가지 버퍼들의 계산,
을 진행하고, 재질 왜곡이나 차폐나 불투명, 스텐실, 같은것도 이 단계에서 어느정도 계산을 수행한다.
실제 mesh 에 적용되는 Light 정보도 여기서 캐싱을 하는데, Defferred 라서 여기서 그런 계산들을 많이 진행하는 것이고,
Forward 는 그러지 않는다.
Particle 이 있었다면, 깊이버퍼랑, 여러 버퍼들이 필요한 파티클 들만
따로 계산을 수행한다.
Movable 오브젝트, 움직이는 캐릭터, 들이 있다면,
motion blur 라든지, temporal antiailiacing 을 표현하기 위해서,
계산 가능한것들을 재계산을 수행한다.
-
LightCompositionTasks_PreLighting ( 프리라이팅으로 주변 폐색 계산 )