[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트강 민우
에픽게임즈에서 제작한 포트나이트(Fortnite)는 액션 빌딩 게임으로, 낮과 밤의 환경이 존재하며 낮에는 나무, 벽돌, 철 등 오브젝트를 부수고 수집한 자원으로 건물 및 함정을 건설하고 밤에는 습격해 오는 몬스터를 물리치는 것이 특징입니다. 이런 역동적인 환경을 만들기 위해서 언리얼 엔진 4에 추가한 다양한 라이트, 섀도, 캐릭터 애니메이션 기능 그리고 100% 리얼타임 게임 트레일러를 제작하는데 사용된 ‘시퀀서’에 대해서도 살펴봅니다.
3. DirectX11은 처음이라…
• DirectX9과 비교해서 달라진 인터페이스
• Shader 기반의 Rendering Pipeline
• Shader 종류 추가 ( compute shader..etc )
• Multi Thread Rendering (Device, DeviceContext로 분할)
• Etc..
일정 시간을 DirectX11 공부에 매진…..
5. Deferred Rendering이 뭐에요?
• 두 번의 Rendering을 통해 빛을 계산하는 기법
• 픽셀 수만큼만 빛 계산을 하여 계산 량을 줄임.
• 빛이 다른 Object에 영향을 주는 기법 등을 사용가능.
(halo기법 등)
• Screen Space에서 계산을 하기 때문에 Culling된 Object는 고려
할 수 없음
6. G-Buffer
• 후에 빛 계산을 위해서 필요한 정보들을 담고 있는 Buffer
• OMSetRenderTargets을 통해 다수의 RenderTarget을 설정가능
• G-Buffer를 통해 ScreenSpace의 3차원 정보를 복구가능
ex ) screen space에서 world position을 복원
8. Depth Buffer – 안 보이는 문제
• view volume의 near, far plane 거리가 너무 커서 값이 죽음.
• near, far plane은 최대한 object에 맞춰서 조절함
9. Fbx Model 띄우기
• 처음에는 Box를 직접 그려서 구현
• Elin.fbx을 받아 띄우는 과정에서 많은 이슈들이 발생
• FBX Load, Normal Mapping, TGA, UV …..
10. FBX SDK
• 사용 버전 : 2015.1 FBX SDK
• 2014는 VS13과 호환 안됨
• DirectX와 친밀하지 않음
• 부족하고 믿을 수 없는 자료들
• 복잡하고 쓰기 힘든 인터페이스
• 해마다 달라지는 SDK (FBX Converter가 따로 있을 정도)
13. Elin 띄우기 – TGA가 지원 안 됨.
• DirectX11에서는 기본적으로 TGA파일을 지원하지 않음
• DirectXTex라는 라이브러리를 제공
• Texture포멧을 변경하는 것이 더 효율적이라고 판단하여
TGA파일을 BMP파일로 변환.
참고 : http://directxtex.codeplex.com/
14. Normal Mapping 제대로 하기
• Tangent space normal mapping을 하기 위해 TBN Matrix 필요
Left : object space normal map / right : tangent space normal map ( 상대적인 정보만 저장)
15. Normal Mapping 제대로 하기
• Bitangent 계산을 제대로 하지 않아 normal mapping 오류!
그림자 방향이 일정하지 않음.
가운데 조명을 기준으로 바깥이 어두워야 함.
16. Normal Mapping 제대로 하기
• 기존방식
• biTangent = cross(normal,tangent);
• Elin 모델에서 대칭되는 부분은 리소스를 아끼기 위해 UV값 중 하나의
값을 뒤집는 부분이 있음(예 : 장화, 옷 / uv address wrap 기준)
• Tangent가 뒤집히면서 local space까지 뒤집힘.
• 해결
• Tangent는 U에 정렬, BiTangent는 V에 정렬해서 구함
19. SSAO가 뭐에요?
• Screen Space Ambient Occlusion
• 얼마나 빛이 덜 들어오는지.
• 벽의 구석이나 사물의 깊이 파인 부분에 그림자를 표현.
• 매쉬 정보를 사용하지 않기 때문에 화면 복잡도와 상관없이 일정한 속도
로 화면을 갱신할 수 있다.
34. SSDO가 뭐에요?
• Screen Space Directional Occlusion
• 들어오는 빛의 방향까지 고려한 차폐 계산
• SSAO에서 이미 계산했던 것을 활용하는 방법을 택함.
: env.map을 활용하는 방법은 사용하지 않음
: 동일한 sample kernel 사용
• Indirect Bounce를 추가 ( 1단계 )
36. SSDO 구현 순서 – Indirect Bounce 추가
차폐된
sample position
선정
sample position에
패치 붙이기 색상 가져오기
blur 추가,
+ diffSpec
37. 1) 차폐된 sample position 선정
2) sample position에 패치 붙이기
• sample position의 world normal 추출
• bounce 여부 검사
max(dot(originalWorldNormal, originalToPos), 0)
반구 안에서 sampling kernel을 회전 시키기 위해 회전 행렬을 생성한다.
회전 행렬은 normal, tangent(normal과 random vector로 gram schmidt process를 통해 계산한 normal과 수직한 vector), bitangent(normal x tangent)로 이루어진 local space 정보를 담고 있다.
옆 설명을 보시라.
왼쪽에서 우리가 고려할 포인트는 사실 구 보다 훨씬 뒤에 있는데… project하면 사실 겁나 먼 지점이랑 비교할 수도 있다 이거지.