2. Unreal Engine 4 Forward / Deferred Rendering
00
주제 선정 이유
때는 2016년 대학시절...
시작해요 언리얼 2016 전국 투어 부산에 참여.
포워드 렌더링은 신기술이라고 생각해버린
무지했던 그 시절… (이불킥)
(퀄리티가 개선된 포워드 렌더링임)
3. Unreal Engine 4 Forward / Deferred Rendering
00
주제 선정 이유
만들어만 봤기에 리마인드
4. Unreal Engine 4 Forward / Deferred Rendering
00
주제 선정 이유
언리얼 엔진에서는 기본적으로 Deferred, 모바일 디바이스에서는 Forward를 사용.
왜 그런지 좀 더 깊이 이해보자!
5. Unreal Engine 4 Forward / Deferred Rendering
00
주제 선정 이유
언리얼 서밋에서 나왔던 내용을 공부해서 발표하기 위한 선행 발표
가 필요하다는 느낌으로 준비.
6. Unreal Engine 4 Forward / Deferred Rendering
01
Forward Rendering?
전통적인 렌더링 방식 (신기술 아님)
오브젝트 하나를 그리는데 다음과 같은 과정을 거친다
(렌더링 파이프라인)
즉시 Back Buffer에 그린다.
7. Unreal Engine 4 Forward / Deferred Rendering
01
Forward Rendering
과거의 게임들은 Forward Rendering
하드웨어의 지원을 받는 안티 앨리어싱 처리
반투명 처리
8. Unreal Engine 4 Forward / Deferred Rendering
01
Forward Rendering 문제점
많은 조명을 연산하는데 부하가 크다 (Object * Light)
보여지지 않는 부분도 조명 연산을 한다.
조명 연산 부하. 아래의 그림에서 조명이 100개라면 300번의 조명 연산을 하게 된다.
조명 연산 x 2 조명 연산 x 4 조명 연산 x 6
9. Unreal Engine 4 Forward / Deferred Rendering
02
Deferred Rendering
Forward Rendering의 조명 연산 문제를 해결하기 위해 나온 렌더링 기법
필요한 장면들을 먼저 그린 후 GBuffer라는 곳에 저장
GBuffer의 장면을 합성하여 최종 결과물을 렌더링하는 기법
10. Unreal Engine 4 Forward / Deferred Rendering
02
GBuffer
GBuffer (Geometry Buffer)는 렌더 타겟(Texture)들을 모아둔 버퍼
MRT (Multi Render Target)을 이용하여 그린 후 GBuffer라 불리는 메
모리 상에 저장한다.
색상만 그려놓은 Albedo
조명 연산을 위한 Normal
장면에서 위치 값을 얻기 위한 Depth
재질을 표현할 수 있는 Sepcular
등 필요한 정보들을 기본적으로 기록한다.
11. Unreal Engine 4 Forward / Deferred Rendering
02
GBuffer
MRT는 DX9에서는 최대 4장 DX11에서는 최대 8장을 세팅하여 그릴 수 있다.
1 Pass에 연산에 필요한 장면들을 그리고 GBuffer에 저장.
2 Pass에 GBuffer의 텍스처를 가져와서 연산이 완료된 장면을 그린 후
Back Buffer에 합성하여 최종 장면을 그린다.
12. Unreal Engine 4 Forward / Deferred Rendering
02
Deferred 조명 연산
각 필요 장면을 그리고
조명의 개수만큼 Normal과 Depth에 연산
(조명 개수 * 픽셀수)
오브젝트 수는 조명 연산과 관계없다.
다수의 동적인 라이트 사용에 유리하다.
GBuffer
13. Unreal Engine 4 Forward / Deferred Rendering
03
Deferred Rendering
필요한 정보를 그려 GBuffer에 저장 후 그것을 이용하여 필요 연산을 지
연하여 그리기 때문에 지연(Deferred) 렌더링 또는 후처리 렌더링 이라고
한다.
14. Unreal Engine 4 Forward / Deferred Rendering
03
Deferred Rendering 단점
하드웨어 안티 앨리어싱 처리의 도움을 받을 수 없다.
반투명 처리가 힘들다. (Forward로 따로 그리는 방법을 사용)
15. Unreal Engine 4 Forward / Deferred Rendering
04
하드웨어 앨리어싱 지원을 못받는 이유는?
먼저 엘리어싱이 무엇이고 어떻게 처리하는지 본다.
엘리어싱 현상은 모니터 화면을 그릴 때 정점 데이터를 이용하여 레스터라이즈 단계에서
화면에 그릴 수 있는 픽셀이 부족하여 계단 처럼 보이는 현상이다.
16. Unreal Engine 4 Forward / Deferred Rendering
04
하드웨어 앨리어싱 지원을 못받는 이유는?
이때 Back Buffer에 그릴 때에는 하드웨어의 지원을 받아 안티 앨리어싱을 해준다.
안티 앨리어싱 기법으로 현재 픽셀과 주변 픽셀을 비교하여 중간색으로 만들어주는
색을 뭉개는 기법으로 계단 현상을 완화해 주는 것이다.
17. Unreal Engine 4 Forward / Deferred Rendering
04
하드웨어 앨리어싱 지원을 못받는 이유는?
만일 Deferred Rendering을 위해 GBuffer에 저장할 Texture에 하드웨어 안티 앨리어싱 처
리를 하여 뭉게 지는 경우 정확한 최종 장면 연산을 할 수 없을 것이다. 그렇기 때문에 렌
더 타겟에 그릴 때에는 하드웨어 안티 앨리어싱을 지원하지 않는다.
그래서 디퍼드에서 안티 앨리어싱을 하기 위해서는 직접 최종 장면에서 구현해야한다.
현세대 고성능 PC 게임은 디퍼드로 그리면서 다양한 안티 앨리어싱 옵션을 제공한다.
그것을 보고 디퍼드에서 사용할 수 있는 안티 앨리어싱 기법들을 찾아보면 좋을 것이다.
18. Unreal Engine 4 Forward / Deferred Rendering
05
반투명 처리가 힘든 이유?
우선 캐릭터가 반투명 창문 뒤에 있다고 생각한다.
이때 캐릭터가 보이도록 창문을 그린 것 까지는 좋았다. Albedo는 잘 그릴 것이다.
19. Unreal Engine 4 Forward / Deferred Rendering
05
반투명 처리가 힘든 이유?
그런데 Normal과 Depth를 그릴 경우 문제가 생긴다.
마지막으로 그려진 창문의 Normal과 Depth 값으로 캐릭터가 가려진채로 그려진다.
이렇게 되면 캐릭터는 정상적인 조명 연산 처리를 할 수 없다.
그렇기 때문에 반투명 처리가 힘들어 Deferred로 그린 후 반투명은 Forward로 그리는 처리를 해준다.
20. Unreal Engine 4 Forward / Deferred Rendering
06
언리얼이 모바일 또는 VR에서 다시 Forward를 사용하는 이유
모바일의 경우 하드웨어 특성상 CPU와 GPU가 결합된 형태이고 메모리를 많이 사용할 수록 발열과 배
터리 소모가 심해진다. 또 하드웨어 적으로 Tile Based Rendering을 지원하여 타일을 나눠 변경된 부분
만 새로 그리는 방법으로 메모리를 절약하고 있다.
그런 폰 위에서 Deferred Rendering을 사용한다면 메모리 과사용으로 스마트폰으로 장시간 게임을 할
수 없기 때문에 Forward를 택했을 것이다.
21. Unreal Engine 4 Forward / Deferred Rendering
06
언리얼이 모바일 또는 VR에서 다시 Forward를 사용하는 이유
VR의 경우 Oculus 기준으로 정해진 최소 사양에서 90FPS 이상 나오지 않을 경우 게임을 업로드 할 수
없다. 사용자 경험을 망친다는 이유에서 이다. 그리고 VR 화면은 2개의 화면을 그리고 또 그 해상도도
매우 높기 때문에 Deferred Rendering을 사용할 경우 성능이 저하 될 것이다.
그렇기에 Unreal Engine 4에서는 VR을 위해 모바일용이 아닌 Forward Rendering를 지원하기 시작하
였다.
22. Unreal Engine 4 Forward / Deferred Rendering
07
DX9에서 구현했던 방법
GBuffer에서 사용할 Render Target Texture를 생성
https://github.com/4roring/KK1_Eternal_Crusade/blob/master/Engine/Utility/Code/Renderer.cpp
23. Unreal Engine 4 Forward / Deferred Rendering
07
DX9에서 구현했던 방법
장치에 연산에 필요한 장면을 그리기 위한 렌더 타겟 세팅
24. Unreal Engine 4 Forward / Deferred Rendering
07
DX9에서 구현했던 방법
Vertex 연산 후 Pixel 연산에서 Out에 각 연산에 필요 정보를 나눠 그리는 것을 볼 수 있다.
각 렌더 타겟에 그리는 것.
25. Unreal Engine 4 Forward / Deferred Rendering
07
DX9에서 구현했던 방법
이제 GBuffer에 있는 텍스처들을 쉐이더에 세팅.
26. Unreal Engine 4 Forward / Deferred Rendering
07
DX9에서 구현했던 방법
GBuffer의 정보를 이용하여 조명 연산.
27. Unreal Engine 4 Forward / Deferred Rendering
07
DX9에서 구현했던 방법
최종적으로 장면 연산
28. Unreal Engine 4 Forward / Deferred Rendering
부록
UE4 Insight
원래는 좀 더 언리얼 엔진 내부에서 렌더링할 때 일어나는 일을 정리하고 싶었으나
다음 기회에 진행하도록 하고 부록으로 Unreal 4.23부터 사용할 수 있는 프로파일링 데이터
시각화 툴이 있다는 것을 소개한다.
아직 한글화된 공식 문서는 없기에 영어 문서만 존재하고 아래의 경로에서 실행하거나
Github에서 엔진 풀소스를 받으면 프로젝트 중 UnrealInsight가 있어서 직접 빌드하여 사용
하면 된다.
https://docs.unrealengine.com/en-US/Engine/Performance/UnrealInsights/index.html
29. Unreal Engine 4 Forward / Deferred Rendering
UE4 Insight
엔진 또는 게임보다 툴을 먼저 켠다.
부록
30. Unreal Engine 4 Forward / Deferred Rendering
UE4 Insight
그 후 프로파일링을 진행할 UE4로 만들어진 게임 또는 언리얼 엔진을 켜면 기록이 시작된다.
부록