조명은 크게 두 가지로 나눌 수 있습니다.
모든 빛의 반사를 계산하는 전역 조명(GI, Globl illumination)과 조명 알고리즘을 사용하는 방법이 있습니다.
[전역 조명]
글로벌 일루미네이션은 두 가지로 나뉩니다.
- 레이트 레이싱 : 실시간으로 빛의 반사 계산
- 라이트 맵 방식 : 미리 조명을 모두 계산한 '라이트 맵' 작성
레이트 레이싱은 실시간으로 수행해야 하므로 기술적인 한계로 인해 사용하는 것은 사실상 힘듭니다.
라이트맵은 많이 쓰이지만, 조명을 미리 계산해놓기 때문에 오브젝트의 위치를 바꾼다거나, 빛의 방향을 바꾼다거나 하는 행동은 할 수 없습니다.
[조명알고리즘]
조명 알고리즘은 앰비언트라이트 (주변광, 환경광), 디퓨즈 라이트, 스페큘러 라이트 셋으로 나뉩니다. 중요하진 않지만 이는 퐁-셰이딩 방법이라고 하며, 정확히는 빛을 만드는 것이 아니라, 빛이 만드는 색을 계산하는 방법입니다.
[Ambient Light(환경광)]
글로벌 일루미네이션에서 환경광이란 빛이 직접 닿지는 않지만, 빛의 반사를 통해 빛이 어느정도 간접적으로 닿는 것을 의미하지만, 조명 알고리즘을 사용할 때는 이걸 구현할 수 없기 때문에 그냥 빛이 어느정도 ‘있을 것이다’ 라고 가정하고 구현한 것을 의미하며, 그렇기 때문에 상수값을 더하여 구현합니다.
[Diffuse Light(난반사광)]
빛이 직접 닿는 곳의 휘도를 구하는 작업이다.
빛은 수직으로 내리꽂을 때 가장 밝고, 사선으로 비스듬히 비출 때 가장 어둡기 때문에, 0도에 가까워질 수록 작아지고 90도에 가까워 질수록 커지는 cosine을 사용하여 값을 구한다.
[Specular Light(정반사광)]
반사된 빛이 눈에 직격에 가깝게 닿을 때 그 부분이 하이라이트 되어 밝게 빛나는 것을 말한다.
그렇기 때문에 반사벡터를 구하는 작업이 필요하며, 반사벡터를 구하기 위해서는 투영벡터를 알아야 합니다.
반사 벡터는 정반사이고, 정반사는 입사각과 반사각이 동일하기 때문입니다.
<투영 벡터>
이렇게 입사벡터(P), 법선벡터(n), 반사벡터(R)이 있다고 하면
입사벡터의 역벡터(-P)를 법선벡터(n)의 연장선상에 투영시켜 투영 벡터 n(-P·n) 를 구합니다.
이후 입사벡터(P)의 시작지점을 법선벡터(n)의 시작지점으로 옮기면 반사벡터(R)을 구할 수 있습니다.
입사벡터(P) + 2 * 투영벡터(n(-P·n)) = 반사벡터(R)
'DirectX 11' 카테고리의 다른 글
DirectX 11 - Ouput merger (0) | 2024.05.31 |
---|---|
DirectX 11 - Fragment Shader(Pixel Shader) (1) | 2024.05.31 |
DirectX 11 - Rasterization (0) | 2024.05.31 |
DirectX 11 - Geometry Shader (0) | 2024.05.31 |
DirectX 11 - Tesselator (0) | 2024.05.31 |