계속해서 pixel shader에 대해 알아보겠습니다. 이번에는 Lighting에 대한 내용을 다루어보겠습니다. 아마 유니티나 언리얼에 대한 경험이 있다면, 도움이 많이 될 것입니다.
이 포스트는 경희대학교 게임 그래픽 프로그래밍 수업자료를 바탕으로 합니다.
6-6. Lighting
Lighting
▪ 조명이란 빛과 사물의 상호작용을 다루는 기법을 말한다.
▪ 가장 대중적인 조명 방식은 Phong model을 기반으로 한다. 상업용 게임에 널리 사용되며 다양한, 고급의 조명 기술 기반을 마련하도록 한다.
Phong model
▪ Phong model은 4개의 항으로 구성된다.
• Diffuse
• Specular
• Ambient
• Emissive
광원의 유형
▪ Point light
• 한 지점에서 모든 방향으로 빛을 방출한다.
• 빛의 강도는 거리에 따라 감소한다.
▪ Directional light (the light which is extremely far away from the scene)
• 한 방향에서 균일하게 장면을 비춘다.
• 빛의 강도가 거리에 따라 변하지 않는다.
▪ Spotlight
• 원뿔 모양의 조명을 만든다.
• light cone과 spotlight sourrce의 중심에 가까울수록 강도가 증가한다.
▪ Ambient
• 광원이 없어도 물체를 비춥니다. (일정한 빛)
• 빛의 강도가 완전히 균일하다.
6-6-1. Diffuse Term
Diffuse light(확산광)이란?
▪ Diffuse light는 직사광선이 표면에 닿을 때 산란광을 나타낸다.
▪ 빛이 균일하게 분산됩니다.
PhongLighting 모델의 Diffuse term
▪ Diffuse term은 이상적으로 확산된 표면의 반사가 모든 방향에서 동일한 강도로 산란된다는 Lambert의 법칙을 기반으로 한다.
▪ 따라서 인지되는 반사량은 view driection과 무관하며 들어오는 빛의 양에 비례한다.
=> 카메라의 위치와 관계없이, 빛의 세기에 영향을 받음
확산 계산
▪ light 벡터(l)와 surface norrmal(n)을 고려해보자.
▪ diffuse term은 max(n·l, 0)sd⊗md에 의해 결정될 수 있다. 여기서 sd는 광원의 RGB 색상, md는 물체 재료의 확산 반사율, ⊗는 성분별 곱셈을 의미한다.
• term max(n· l, 0)는 밝기를 결정하기 위해 빛의 각도를 고려한다.
• material parameter인 md는 재료 속성을 고려하여 조명의 색상을 변경한다. 백색광(1, 1, 1)을 가정하자. 빛에 의해 조명된 물체가 노란색으로 보인다면 물체가 R과 G를 반사하고 B를 흡수한다는 것을 의미한다. material parameter를 통해 이러한 종류의 필터링을 쉽게 구현할 수 있다. 즉, (1,1,0)이면 ( 1,1,1)⊗(1,1,0)=(1,1,0)인 것이다. 아래 그림을 보자.
6-6-2. Specular Term
금속 표면을 생각하자.
specular term은 하이라이트를 통해 표면을 빛나게 만드는 데 사용되며, light 벡터(l) 외에 view 벡터(v)와 reflection 벡터(r)가 필요하다.
reflection vector 계산은 아래와 같다.(n과 l은 normalized vector이다)
반사되는 빛과 view direction이 같을 때 가장 강도가 강할 것이다.
Diffuse term은 view-independent지만, Specular term은 view-dependent하다.
▪ 완벽하게 빛나는 표면을 위해 p의 하이라이트는 ρ가 0일 때만 보인다.
▪ 광택이 전혀 나지 않는 표면의 경우 ρ가 0일 때 최대 하이라이트가 발생하지만 ρ가 증가함에 따라 이 수치는 급격히 떨어진다.
6-6-3. Ambient Term
ambient light(주변광)이란?
▪ ambient light은 간접조명을 고려한 일반적인 illumination을 말한다. ambient light은 장면의 다양한 개체에서 반사된 빛을 설명한다. ambient light가 scene에서 많이 반사됨으로써, 모든 방향에서 표면 점에 도달하고 표면 점으로부터의 반사도 모든 방향에서 동일한 강도로 산란된다.
6-6-4. Emissive Term
emissive term이란?
▪ Phong model의 마지막 term인 emissive term은 표면 자체에서 방출되는 빛의 양을 말한다.
아래 그림에서 왼쪽은 emmsive가 없고, 오른쪽은 emmisive가 활성화된 상태이다.
6-7. Phong Lighting Model
Phongmodel은 위에서 설명한 4개의 항을 합산하여 만들어진다.
6-8. Per-pixel Lighting
물체의 표면에 있는 두 점을 생각해 보자. 각 점은 개별의 픽셀을 구성한다. l, n, r 및 v를 사용하여 pixel shader의 lighting을 계산해보자.
▪ directional light을 가정한다면, 모든 표면 점에 대해 l은 일정하다. 픽셀 셰이더에 constant buffer로 제공됩니다.
▪ 반면, n, r, v는 물체의 표면에 따라 다르다. 픽셀 셰이더가 실행할 때마다 n과 v의 고유한 쌍이 주어지며, 픽셀 셰이더는 r(r = 2n(n·l)-l)을 계산한다.
Normal for each pixel
▪ l이 world space 벡터이므로 n도 world space에서 정의되어야 한다.
▪ 이를 위해 vertex shader는 각 vertex의 object-space normal을 world-transform하고 rasterization 단계에 world-space normal을 전달한다.
▪ rasterization 단계에서 vertex normal은 각 픽셀에 대해 n을 제공하기 위해 보간된다.
▪ 각각 별개의 픽셀을 구성하는 것으로 가정되는 a와 b에 rasterizer는 n1과 n2를 보간하여 법선 na와 nb를 할당한다.
View vector for each pixel
▪ 픽셀 a 및 b에 대해 각각 va 및 vb로 표시된 world-space view 벡터도 필요로 한다.
▪ 이를 위해 vertex shader는 각 vertex의 object-space 위치를 world-space으로 변환하여 worrld-space에서 정의된 카메라 위치인 EYE에 연결한다.
▪ 정점별 worrld-space view 벡터는 v1과 v2이다.
▪ 이들은 rasterization단계로 전달되고 보간되어 va 및 vb를 생성하게 된다.
최정적으로 픽셀 셰이더는 픽셀 색상을 결정한다.
▪ n과 v가 픽셀 셰이더에 입력으로 제공되고 l이 Direct3D 프로그램에 의해 constant buffer로 제공되면 픽셀 셰이더는 먼저 reflection 벡터, 즉 r=2n(n·l)-l을 계산하고 마지막으로 Phongmodel을 구현한다.
▪ l, n, r, v는 모두 world space에 정의되어 있음을 주의한다.