물체를 보다 실감나게 표현하기 위해서는 물체의 재질(material)과 광원의 상호 작용이 필요하다. 광원을 고려하지 않고 픽셀의 색을 결정한다면 텍스처의 샘플링 값이나 버텍스 버퍼나 다른 버퍼에 저장된 물체의 색을 그대로 사용하면 되겠지만, 현실과 가까운 느낌의 물체를 렌더링 할 수는 없을 것이다.
물체의 색을 결정하기 위해선 광원에서 나온 빛이 물체와 충돌하고 반사되어 나온 빛이 관찰자의 눈으로 들어와야 된다. 이 과정에서 눈에 들어오는 빛의 세기 역시 색의 결정에 영향을 주게 된다. 따라서 조명을 사용하여 물체를 렌더링 하고자 한다면 빛의 방향, 빛의 세기, 빛의 위치 등과 같은 광원에 대한 정보와 함께 반사되는 빛의 유형에 대한 정의도 필요하다. DirectX에서 조명 효과를 만들기 위해 일반적으로 고려하는 빛의 유형은 다음과 같다.
앞으로 살펴볼
ambient
,diffuse
,specular
는 빛의 유형에 따라 물체의 색에 후보정을 해주는 작업에 사용되는 요소이다. 이 요소들은 물체가 가지고 있는 그 자체의 색이나 텍스처로부터 샘플링된 값에 곱하여 사용하는 것이 일반적이다.
1. Ambient Light(주변광, 환경광)
우리 눈이 물체를 인식하기 위해선 물체에서 반사되어 나온 빛이 필요하다. 물체에서 반사되어 나온 빛은 크게 두 종류로 나눌 수 있는데, 하나는 빛이 직접 물체와 부딪혀 반사되어 나오는 것과 다른 하나는 주변 물체에서 반사된 빛을 받아 반사되는 것이다. ambient
는 후자의 빛을 의미한다.
가장 정확한 ambient
의 추적을 위해서는 반사되어 어떤 물체로 들어오는 모든 빛을 추적해야 하지만 컴퓨터 그래픽스에서는 효과적인 구현을 위해 일반적으로 ambient
는 상수로 취급한다. 어떤 물체가 가지고 있는 그 자체의 색이 화면에서 완전히 가려지는 것을 방지하기 위해 (0.1, 0.1, 0.1)
과 같이 사용하면 된다.
2. Diffuse Light(난반사광)
앞에서 살펴본 ambient
가 주변 물체에서 반사되어 들어온 빛이라면, diffuse
와 뒤에서 볼 specular
는 광원이 물체와 부딪혀 반사되어 나온 빛이라고 할 수 있다. 그 중에서 diffuse
는 난반사에 대한 성분을 의미한다.
난반사는 어떤 물체에 입사된 빛이 특정 방향으로 반사되는 것이 아니라 여러 방향으로 불규칙하게 반사되는 것을 의미한다. 난반사되는 빛의 방향이나 세기는 물체의 표면 재질에 따라 달라지며, 불규칙적이고 예측할 수 없다. 따라서 컴퓨터 그래픽스에서는 난반사된 빛을 모두 추적하는 것은 매우 어려운 작업이므로 근사치 모델을 사용한다. 난반사된 모든 빛이 모든 방향으로 균일한 힘을 가지고 주위에 영향을 준다고 가정하는 것이다.
결과적으로 diffuse
에 영향을 주는 요소는 물체로 들어오는 빛의 세기이다. 빛은 물체와 충돌할 때 서로 수직인 경우에 가장 큰 힘을 가지게 된다. 이를 계산하기 위해 필요한 요소는 빛을 받는 물체의 표면의 노멀 벡터 $n$과 물체의 표면에서 광원으로 향하는 벡터 $l$이다. 이 두 벡터가 이루는 각이 0에 가까울수록 빛은 온전하게 물체에 영향을 줄 것이다. 이 값은 두 벡터의 내적으로 구할 수 있다.
3. Specular Light(정반사광)
specular
는 정반사되어 나온 빛의 성분을 표현하기 위해 사용한다. 정반사된 빛은 한 방향으로만 향하기 때문에 계산이 가능하다. 또한 반사된 빛의 방향과 관찰자의 시점에 따라 관찰자가 정반사된 빛의 요소를 못 볼 수도 있다. 그렇기 때문에 specular
는 빛의 세기와 함께 관찰자의 시점도 함께 고려해야 한다.
쉐이딩 모델에 따라 specular
를 계산하는 방법이 달라질 수 있는데, 퐁 쉐이딩에서는 정반사되어 나온 빛 $r$과 물체의 표면에서 관찰자의 시점으로 향하는 벡터 $e$와의 내적을 통해 시점에 따른 빛의 영향력을 계산할 수 있다.
'그래픽스 > DirectX11' 카테고리의 다른 글
쉐이더 리소스 뷰(ID3D11ShaderResourceView) 사용하기 (0) | 2024.06.11 |
---|---|
회전 행렬 유도 (0) | 2024.05.13 |
노멀 벡터 변환 (0) | 2024.05.08 |
쉐이더 만들기(버텍스, 픽셀) (0) | 2024.04.22 |
버텍스 버퍼, 인덱스 버퍼, 컨스턴트 버퍼 (0) | 2024.04.22 |