ݺߣ

ݺߣShare a Scribd company logo
실전 프로젝트
최종 발표
정강 / 현찬
우리의 목표
• Deferred rendering
• SSAO
• SSDO
• DirectX11만을 사용하여 구현
DirectX11은 처음이라…
• DirectX9과 비교해서 달라진 인터페이스
• Shader 기반의 Rendering Pipeline
• Shader 종류 추가 ( compute shader..etc )
• Multi Thread Rendering (Device, DeviceContext로 분할)
• Etc..
일정 시간을 DirectX11 공부에 매진…..
Deferred rendering
easy to implement post-processing
Deferred Rendering이 뭐에요?
• 두 번의 Rendering을 통해 빛을 계산하는 기법
• 픽셀 수만큼만 빛 계산을 하여 계산 량을 줄임.
• 빛이 다른 Object에 영향을 주는 기법 등을 사용가능.
(halo기법 등)
• Screen Space에서 계산을 기 때문에 Culling된 Object는 고려
할 수 없음
G-Buffer
• 후에 빛 계산을 위해서 필요한 정보들을 담고 있는 Buffer
• OMSetRenderTargets을 통해 다수의 RenderTarget을 설정가능
• G-Buffer를 통해 ScreenSpace의 3차원 정보를 복구가능
ex ) screen space에서 world position을 복원
Depth Buffer
• DirectX11에서는 Depth Buffer를 가져올 수 있음
• DepthStencilView와 ShaderResourceView의 포멧을 신경써야함
결과물
?
?
?
Depth Buffer – 안 보이는 문제
• view volume의 near, far plane 거리가 너무 커서 값이 죽음.
• near, far plane은 최대한 object에 맞춰서 조절함
Fbx Model 띄우기
• 처음에는 Box를 직접 그려서 구현
• Elin.fbx을 받아 띄우는 과정에서 많은 이슈들이 발생
• FBX Load, Normal Mapping, TGA, UV …..
FBX SDK
• 사용 버전 : 2015.1 FBX SDK
• 2014는 VS13과 호환 안됨
• DirectX와 친밀하지 않음
• 부족하고 믿을 수 없는 자료들
• 복잡하고 쓰기 힘든 인터페이스
• 해마다 달라지는 SDK (FBX Converter가 따로 있을 정도)
Elin 띄우기
• 엘린 턱이 빠져있다…
• 이번엔 머리카락만 붕 떠 있다…
• 군데 군데 빵꾸가 …?!
• GitHub에서 코드를 뒤져 사용방법을 익힘
Elin 띄우기 – UV 값이 일부 망가짐
텍스쳐가 이상하게…
Elin 띄우기 – TGA가 지원 안 됨.
• DirectX11에서는 기본적으로 TGA파일을 지원하지 않음
• DirectXTex라는 라이브러리를 제공
• Texture포멧을 변경하는 것이 더 효율적이라고 판단하여
TGA파일을 BMP파일로 변환.
참고 : http://directxtex.codeplex.com/
Normal Mapping 제대로 기
• Tangent space normal mapping을 기 위해 TBN Matrix 필요
Left : object space normal map / right : tangent space normal map ( 상대적인 정보만 저장)
Normal Mapping 제대로 기
• Bitangent 계산을 제대로 하지 않아 normal mapping 오류!
그림자 방향이 일정하지 않음.
가운데 조명을 기준으로 바깥이 어두워야 함.
Normal Mapping 제대로 기
• 기존방식
• biTangent = cross(normal,tangent);
• Elin 모델에서 대칭되는 부분은 리소스를 아끼기 위해 UV값 중 하나의
값을 뒤집는 부분이 있음(예 : 장화, 옷 / uv address wrap 기준)
• Tangent가 뒤집히면서 local space까지 뒤집힘.
• 해결
• Tangent는 U에 정렬, BiTangent는 V에 정렬해서 구함
Normal Mapping 제대로 기
SSAO
screen space ambient occlusion
SSAO가 뭐에요?
• Screen Space Ambient Occlusion
• 얼마나 빛이 덜 들어오는지.
• 벽의 구석이나 사물의 깊이 파인 부분에 그림자를 표현.
• 매쉬 정보를 사용하지 않기 때문에 화면 복잡도와 상관없이 일정한 속도
로 화면을 갱신할 수 있다.
SSAO demo
SSAO 구현 순서
test point의
world position
재구성
반구를 얹어
sample kernel
생성기
차폐 정도 계산
blur 추가,
* Ambient
*ViewProjInverse *ViewProj
필요한 정보
• Depth
• (world) Normal
1) world position 재구성
• normalize screen coordinate
• InverseViewProj matrix를 곱하여 world position 재구성
2) Sample Kernel 생성
• noise texture에서 random vector 추출.
• TBN matrix 생성.
2) Sample Kernel 생성
• 8개의 sample kernel 생성
• sampleSphere[8]은 미리 준비한 벡터 사용
3) 차폐 정도 계산
• 각각의 sample position의 depth값을 얻기 위해 다시 screen
coordinates로 전환
• screen coordinates의 원래 depth값을 읽어와서 비교.
3) 차폐 정도 계산
• 차폐된 샘플 : A, D
• P와의 거리에 따라 값 결정
distance= P – A’.z;
occlusion = saturate((fadeEnd - distance) / (fadeLength));
• occlusionSum / N
3) 차폐 정도 계산 – 더 고려할 점
• 같은 평면인데 어둡게 나타나는 경우
3) 차폐 정도 계산 – 더 고려할 점
• 엘린 주변에 테두리가 생기는 경우
rangeCheck = length(position – originalWorldPos) < radius ? 1 : 0 ;
3) 차폐 정도 계산 – 더 고려할 점
• 가장자리에 번짐 현상
• 아주 가까이 다가 갔을 때 이상 현상
4) 블러 추가
• 가우시안 블러 추가
결과물
SSDO
screen space directional occlusion
SSDO가 뭐에요?
• Screen Space Directional Occlusion
• 들어오는 빛의 방향까지 고려한 차폐 계산
• SSAO에서 이미 계산했던 것을 활용하는 방법을 택함.
: env.map을 활용하는 방법은 사용하지 않음
: 동일한 sample kernel 사용
• Indirect Bounce를 추가 ( 1단계 )
SSDO Demo
SSDO 구현 순서 – Indirect Bounce 추가
차폐된
sample position
선정
sample position에
패치 붙이기 색상 가져오기
blur 추가,
+ diffSpec
1) 차폐된 sample position 선정
2) sample position에 패치 붙이기
• sample position의 world normal 추출
• bounce 여부 검사
max(dot(originalWorldNormal, originalToPos), 0)
3) 색상 가져오기
3) 색상 가져오기 – 어디서?
• 기존방식
• 빛 계산이 적용되지 않은 diffuse texture에서 original color을 뽑아옴.
• 문제점 : 빛이 없어 어두운 부분에서도 color bounce가 계산되는 문제가 발생.
3) 색상 가져오기 – 해결
• 해결
( )+ * diffuseFactor
*{ }
3) 색상 가져오기 – 해결
• 비교
4) 블러 추가
결과물
FXAA
• antialiasing
• MSAA은 Geometry Shader에서 이루어짐
• MSAA는 직렬적인 Rendering Pipeline에서는 사용 불가능
• FXAA는 Depth Buffer를 통해 외곽선을 검출한 후, 외곽선 주변
에 filter를 통과시켜 smooth하게 만들어주는 기법
• NVIDIA에서 제공하는 FXAA 모듈을 사용
Framework
• Framework layer와 contents layer를 나누기 위해 노력
• InputDispatcher등을 만들어서 추가기능들을 정리
• 빛의 위치를 알려주기 위해 billboard사용
• billboard는 마지막에 따로 그려줌.
결과물
감사니다

More Related Content

실전프로젝트 정서경 양현찬

  • 2. 우리의 목표 • Deferred rendering • SSAO • SSDO • DirectX11만을 사용하여 구현
  • 3. DirectX11은 처음이라… • DirectX9과 비교해서 달라진 인터페이스 • Shader 기반의 Rendering Pipeline • Shader 종류 추가 ( compute shader..etc ) • Multi Thread Rendering (Device, DeviceContext로 분할) • Etc.. 일정 시간을 DirectX11 공부에 매진…..
  • 4. Deferred rendering easy to implement post-processing
  • 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을 복원
  • 7. Depth Buffer • DirectX11에서는 Depth Buffer를 가져올 수 있음 • DepthStencilView와 ShaderResourceView의 포멧을 신경써야함 결과물 ? ? ?
  • 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가 따로 있을 정도)
  • 11. Elin 띄우기 • 엘린 턱이 빠져있다… • 이번엔 머리카락만 붕 떠 있다… • 군데 군데 빵꾸가 …?! • GitHub에서 코드를 뒤져 사용방법을 익힘
  • 12. Elin 띄우기 – UV 값이 일부 망가짐 텍스쳐가 이상하게…
  • 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 • 얼마나 빛이 덜 들어오는지. • 벽의 구석이나 사물의 깊이 파인 부분에 그림자를 표현. • 매쉬 정보를 사용하지 않기 때문에 화면 복잡도와 상관없이 일정한 속도 로 화면을 갱신할 수 있다.
  • 21. SSAO 구현 순서 test point의 world position 재구성 반구를 얹어 sample kernel 생성기 차폐 정도 계산 blur 추가, * Ambient *ViewProjInverse *ViewProj
  • 23. 1) world position 재구성 • normalize screen coordinate • InverseViewProj matrix를 곱하여 world position 재구성
  • 24. 2) Sample Kernel 생성 • noise texture에서 random vector 추출. • TBN matrix 생성.
  • 25. 2) Sample Kernel 생성 • 8개의 sample kernel 생성 • sampleSphere[8]은 미리 준비한 벡터 사용
  • 26. 3) 차폐 정도 계산 • 각각의 sample position의 depth값을 얻기 위해 다시 screen coordinates로 전환 • screen coordinates의 원래 depth값을 읽어와서 비교.
  • 27. 3) 차폐 정도 계산 • 차폐된 샘플 : A, D • P와의 거리에 따라 값 결정 distance= P – A’.z; occlusion = saturate((fadeEnd - distance) / (fadeLength)); • occlusionSum / N
  • 28. 3) 차폐 정도 계산 – 더 고려할 점 • 같은 평면인데 어둡게 나타나는 경우
  • 29. 3) 차폐 정도 계산 – 더 고려할 점 • 엘린 주변에 테두리가 생기는 경우 rangeCheck = length(position – originalWorldPos) < radius ? 1 : 0 ;
  • 30. 3) 차폐 정도 계산 – 더 고려할 점 • 가장자리에 번짐 현상 • 아주 가까이 다가 갔을 때 이상 현상
  • 31. 4) 블러 추가 • 가우시안 블러 추가
  • 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)
  • 39. 3) 색상 가져오기 – 어디서? • 기존방식 • 빛 계산이 적용되지 않은 diffuse texture에서 original color을 뽑아옴. • 문제점 : 빛이 없어 어두운 부분에서도 color bounce가 계산되는 문제가 발생.
  • 40. 3) 색상 가져오기 – 해결 • 해결 ( )+ * diffuseFactor *{ }
  • 41. 3) 색상 가져오기 – 해결 • 비교
  • 44. FXAA • antialiasing • MSAA은 Geometry Shader에서 이루어짐 • MSAA는 직렬적인 Rendering Pipeline에서는 사용 불가능 • FXAA는 Depth Buffer를 통해 외곽선을 검출한 후, 외곽선 주변 에 filter를 통과시켜 smooth하게 만들어주는 기법 • NVIDIA에서 제공하는 FXAA 모듈을 사용
  • 45. Framework • Framework layer와 contents layer를 나누기 위해 노력 • InputDispatcher등을 만들어서 추가기능들을 정리 • 빛의 위치를 알려주기 위해 billboard사용 • billboard는 마지막에 따로 그려줌.

Editor's Notes

  • #8: 아무것도 안 나오네요?
  • #12: uv 값이 이상하게 읽혀졌는지 엘린 몸통을 보시면 줄이 쭉 그어져 있져 ㅜㅜ
  • #13: uv 값이 이상하게 읽혀졌는지 엘린 몸통을 보시면 줄이 쭉 그어져 있져 ㅜㅜ
  • #14: 라이브러리가 중요한게 아니니까… ^^//
  • #25: 반구 안에서 sampling kernel을 회전 시키기 위해 회전 행렬을 생성한다. 회전 행렬은 normal, tangent(normal과 random vector로 gram schmidt process를 통해 계산한 normal과 수직한 vector), bitangent(normal x tangent)로 이루어진 local space 정보를 담고 있다.
  • #30: 옆 설명을 보시라. 왼쪽에서 우리가 고려할 포인트는 사실 구 보다 훨씬 뒤에 있는데… project하면 사실 겁나 먼 지점이랑 비교할 수도 있다 이거지.
  • #47: 왼쪽 상자 붉은 색 쪽.