(사실 이해했는지 모르겠다. 어렴풋이 느껴질 뿐... 그래도 그 느낌을 정리한다.)
1. 좀 더 간략하게 정리할 필요를 느꼈다.
- D3D12 API 사용법은 기초수준은 어느정도 알겠고,
- 책에서도 방법론적으로 뭔가 배우는 건 초반 내용이고, 이제는 방법에 집중하는 내용이 많이 나온다.
(원리를 어느정도 설명하고 바로 근사할 수 있는 식을 알려준다.)
2. D3D에서 Lighting 표현하기
- 이 친구는 Shader의 힘을 많이 사용한다.
- Vertex의 Normal, 도형에 맞는 Material, Constant Buffer로 넘어온 Light 를 이용한다.
- 책에서는 대표적인 조명 3가지를 알려준다. Directional Light, Point Light, Spot Light
- 각 조명마다 특징이 있고, Light 속성에 맞춰서 Shader에서 계산하는 방법을 알려줬다.
- 이 챕터에서 사용한 Material에서 속성은 Roughness와 Fresnel 에 의한 Refraction이다.
- 재질 속성에 따른 특징과, Shader에서 계산하는 방법을 알려줬다.
- 어쨌든 Shader는 Normal과 그에 맞는 Material을 가지고 최종적으로 화면에 찍힐 Pixel의 색깔을 결정 짓게 된다.
3. 조명 계산에 사용하는 이런 저런 수학 공식
(그냥 옮겨적기 수준 밖에 안될 것 같은 수학적내용은 생략하고, 냅다 열거하는 걸로 ㅋㅋㅋㅋㅋㅋ)
- Attenuation (선형 감쇠) : Point Light나 Spot Light는 광원에서 빛이 퍼져 나가고, 빛이 퍼져 나가면 멀리있을 수록 단면적에 닿는 빛의 세기가 줄어든다. 그것을 그래픽스에 알맞게 계산할 수 있게 해주는 식이다.
- Schlick fresnel approximation (슐릭 - 프레넬 근사) : 굴절률이 다른 두 재질 사이를 빛이 투과할때는 굴절과 반사가 일어난다. 복잡한 fresnel 공식 대신에, 실시간 렌더링에서 사용할 수 있을 정도로 빠른 근사식이다.
- Roughness (Microfacet Model) : 빛이 모델에 반사되어 카메라로 나갈때, 그 카메라 방향으로 얼마나 온전하게 나갈지를 계산하는 것이다. 표면이 거칠다면 그 빛이 온전하지 않을 것이고, 표면이 매끈하다면 잘 반사가 될 것이다. 여기서는 half-vector와 normal을 몇 번(m) 곱하여 나온 값으로 빛의 양을 구했다.
- Blinn - Phong (블린- 퐁) : Phong 모델을 간략화 한것으로, 위에서 Roughness를 half - vector로 계산했다고 했는데, 그 방법을 말한다. 원래는 퐁 모델은 빛의 방향으로 인한 반사 백터를 구한 다음, 그거와 카메라를 dot해서 (Lambert's Cosine Law, 람베르트 코사인 법칙) 사용하는 것이다.
4. 언급할 만한 예제에서 사용한 방법
- 3가지 종류의 Light 여러개가 Shader로 넘어오게 된다.
- Constant Buffer를 따로파서, 제대로 구분이 되도록 넘겨주는 것도 좋지만
- Light 마다 공유하는 속성이 많고,
- App 단에서도, GPU에서도 용량과 오버헤드를 줄이기 위해 하나의 Light 배열로 만들어서 넣어주었다.
- 그리고 Shader에서 그 Light를 구분하여 계산하는 것을 Index로 하였다.
- App와 Shader에서 Lights[] 에서 몇번부터 몇번이 Directional 이고, Point 이고, Spot 인지 동기화를 시켜서 이를 가능하게 하였다.
5. 연습 문제
(클릭하면 커집니다.)
연습 문제 1 :
연습 문제 2 :
roughness
연습 문제 3 :
- 도움 받은 곳 : 조명의 정석, 3점 조명 세팅_3 POINT LIGHTING SET UP
- 3 point light : key light, fill light, back light
연습 문제 4
- point light 여러개
연습 문제 5
- Spot light 여러개
뭐 보이질 않아서, 방향과 위치를 살짝 바꿔주었다.
연습 문제 6
- Toon Shader, 툰 셰이딩
- ceil 함수를 이용했다.
책 : DirectX 12를 이용한 3D 게임 프로그래밍 입문
'Programming > D3D12' 카테고리의 다른 글
[책공부] Blend 예제 + chap 10 연습 문제 (0) | 2024.01.16 |
---|---|
[책공부] Texturing 예제 + chap 9 연습 문제 (0) | 2024.01.13 |
[책공부] FrameResource 예제 ( + Root Constant) (0) | 2024.01.08 |
[책공부] Chap7 연습 문제 (0) | 2024.01.08 |
[책공부] FrameResource 예제 ( + Descriptor Table) (0) | 2024.01.04 |