그래픽스에서 조명은 빛과 물체 간의 상호작용을 처리하는 기술이다. 보통 지역 조명과 전역 조명 모델 두 가지로 구분된다.
지역 조명은 광원으로부터 물체에 직접 들어오는 빛만을 고려하기 때문에 표면의 재질과 광원의 속성만으로 표면의 색상이 결정된다.
하지만 실세계의 모든 물체는 간접 조명을 받기 때문에 전역 조명 모델은 모든 물체를 잠재적인 광원으로 취급한다.
그렇다고 전역 조명 모델을 그대로 적용하기에는 너무 많은 연산을 필요로 하기 때문에 실시간에 구현하는 것은 어렵다.
그래서 게임에서는 간략화된 전역 조명 알고리즘을 사용하거나 미리 전역 조명을 계산하여 저장한 뒤 런타임에 이를 사용하는 것이 보편적이다.
퐁 조명 모델
퐁 모델은 지역 조명 모델이다.
퐁 모델의 경우 물체의 표면에서 감지되는 색상은 아래와 같은 4가지 항목에 의해 결정된다.
◾ 디퓨즈(diffuse) 반사
램버트의 법칙에 따라 설명된다. (*램버트의 법칙 : 물체의 표면에 들어오는 빛의 세기는 표면에서 빛까지의 벡터 l과 법선 n이 이루는 코사인 값에 비례한다. 각도가 작을수록 더 많은 빛을 받는다.)
램버시안 표면 또는 이상적인 디퓨즈 표면으로 들어온 빛은 모든 방향을 따라 같은 강도로 반사된다. (난반사)
단, l과 n이 이루는 각이 둔각인 경우 음수가 나오기 때문에 최소값을 0으로 처리해야 한다.
◾ 스페큘러(specular) 반사
물체 표면에 하이라이트를 만드는데 사용된다. 시선 벡터(v)와 반사 벡터(r)가 필요하다.
시선 벡터는 물체 표면의 점 p와 카메라를 연결하고 카메라 시선과 반대 방향으로 정의한다.
반사 벡터는 점 p의 법선 벡터 n과 조명간의 입사각과 동일한 각도를 이루며 반사된다.
하이라이트를 볼 수 있는 영역은 r을 중심으로 한 원뿔 모양으로 묘사할 수 있고 v가 원뿔 범위 안에 속한다면 하이라이트를 볼 수 있다.
◾ 앰비언트(ambient) 반사
다양한 물체로부터 반사된 빛, 즉 간접 조명을 앰비언트 라이트라고 부른다.
씬의 모든 지점에서 반사된 빛이 어우러진 것이기 때문에 특정 방향이 아닌 모든 방향을 따라서 표면의 p점에 들어오며 마찬가지로 반사된다.
그렇기 때문에 p점에 들어오는 앰비언트 라이트의 양은 p점의 법선에 독립적이고 반사되는 빛은 카메라 시선에 독립적이다.
◾ 발산광(emissive light)
물체 스스로 발산하는 빛이다.
지역 조명 모델은 발산광을 가진 물체를 광원으로 취급하지 않기 때문에 같은 공간의 다른 물체의 조명 연산에 영향을 주지 않는다.
퐁 조명 모델은 위의 4개 항을 더해서 정의된다.
쉐이더와 쉐이딩 언어
쉐이더 프로그래밍을 위해 선택되는 하이레벨 언어 중 하나는 HLSL, Cg, GLSL가 널리 사용되고 모두 C와 비슷한 언어이다. 이 중 HLSL은 Direct3D에서 사용된다. 책에서는 HLSL에 대해서만 다루게 된다.
쉐이더에서 함수는 최상위 함수와 내장 함수로 구분되고 정점 및 프래그먼트 쉐이더 자신은 최상위 함수이다. 최상위 함수는 여러 내장 함수를 호출할 수 있는데 빈번하게 호출하는 함수는 곱셈 연산을 위한 mul이다.
쉐이더는 실행시마다 변하는 데이터와 모든 쉐이더 실행 시 공유되는 데이터 두 가지 형태의 입력 데이터를 받는다.
조명은 정점별로 적용할수도 있고 프래그먼트별로 적용할 수도 있다. 대체로 프래그먼트별로 적용하는 것이 더 우수한 결과를 생성한다. 정점별로 적용하면 카메라의 위치에 따라 반사광이 균일하지 않을 수 있지만 프래그먼트별로 적용하면 항상 균일한 반사광을 볼 수 있다.
다만 프래그먼트별로 적용하는 조명에서는 정점 쉐이더의 역할은 미미해진다.
전역 조명
대표적인 전역 조명 알고리즘으로는 레이 트레이싱과 래디오시티가 있다.
◾ 레이 트레이싱
뷰 프러스텀은 카메라에 수렴하는 투영선의 집합이고 투영선의 개수는 뷰포트의 해상도와 동일하다. 즉, 투영선 하나가 픽셀 하나의 색상을 결정하는 것이다.
레이 트레이싱 알고리즘에서는 뷰 프러스텀이 정의된 카메라 공간 물체에 투영 변환을 적용하는 대신에 각 투영선의 반대 방향으로 광선을 발사하고 이를 추적하여 해당 투영선을 따라서 들어오는 색상을 계산한다.
이게 바로 픽셀 색상이 되고 1차 광선이라 정의할 수 있다.
1차 광선이 씬의 어떤 물체와도 부딪히지 않으면 씬의 배경색으로 픽셀 색상이 결정된다. (아무런 물체도 통과하지 못했으니 애초에 물체가 존재하지 않는 영역이라는 뜻 같음)
만약 1차 광선이 어떤 물체와 부딪히면 해당 점이 그림자 안에 있는지를 검사하기 위해 그림자 광선이라는 2차 광선을 각 광원을 향해 발사한다. 이 때 그림자 광선이 광원으로 진행하는 도중에 다른 물체와 부딪히면 해당 교차점은 광원의 직접적인 영향권에 있지 않다는 의미가 된다. 그림자 광선이 광원에 도달하면 교차점에 입사하는 빛을 이용해서 직접 조명 색상을 결정하게 된다.
그림자 광선뿐만 아니라 반사 광선과 굴절 광선 2종류가 교차점에서 추가로 발사된다. 이 두가지 광선을 간접 조명을 계산하기 위한 목적으로 발사된다.
레이 트레이싱 알고리즘은 재귀적인 알고리즘이고 광선 트리가 씬을 벗어나거나 미리 정의된 재귀 단계에 도달할 때까지 확장된다.
◾ 래디오시티
디퓨즈 표면 사이에서 반사되는 빛을 시뮬레이션 한다.
래디오시티 알고리즘은 실시간에 구현하기에는 연산량이 너무 많기 때문에 보통 라이트맵으로 미리 만들어둔다.
'이론 > 그래픽스' 카테고리의 다른 글
[Chapter 4] 프래그먼트 처리와 출력 병합 (0) | 2023.05.11 |
---|---|
[Chapter 3] 래스터라이저 (0) | 2023.05.11 |
[Chapter 2] 정점 처리 (0) | 2023.04.27 |
[Chapter 1] 폴리곤 메쉬 (0) | 2022.09.16 |