Programming/D3D12

[책공부] Lighting 예제 + chap 8 연습 문제

Dorasima 2024. 1. 11. 16:11

(사실 이해했는지 모르겠다. 어렴풋이 느껴질 뿐... 그래도 그 느낌을 정리한다.)

 

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 :

            Directional Light 이 빨간색 (255, 0, 0)                                                                                    sinf으로 빛의 세기 진동                     

 

 

연습 문제 2 :

roughness

    grass roughness 1.f / water roughness 0.f                                 grass 0.5f / water 0.5f                                                  grass 0.f / water 1.f                   

 

연습 문제 3 : 

- 도움 받은 곳 : 조명의 정석, 3점 조명 세팅_3 POINT LIGHTING SET UP

- 3 point light : key light, fill light, back light

조명이 한바퀴 돌때 마다 하나씩 추가 된다. key -> fill -> back 순 (빨간 구를 보면 알 수 있다.)

 

 

연습 문제 4 

- point light 여러개

 

연습 문제 5

- Spot light 여러개

뭐 보이질 않아서, 방향과 위치를 살짝 바꿔주었다.

 

연습 문제 6

- Toon Shader, 툰 셰이딩

- ceil 함수를 이용했다.

셰이더에 if 문 넣으면 큰일날것 같다.

더보기

책 : DirectX 12를 이용한 3D 게임 프로그래밍 입문