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)
#25: 반구 안에서 sampling kernel을 회전 시키기 위해 회전 행렬을 생성한다.
회전 행렬은 normal, tangent(normal과 random vector로 gram schmidt process를 통해 계산한 normal과 수직한 vector), bitangent(normal x tangent)로 이루어진 local space 정보를 담고 있다.
#30: 옆 설명을 보시라.
왼쪽에서 우리가 고려할 포인트는 사실 구 보다 훨씬 뒤에 있는데… project하면 사실 겁나 먼 지점이랑 비교할 수도 있다 이거지.