Skip to Content
독학사독학사 3단계컴퓨터그래픽스11. 조명 모델과 반사 계산

이번 문서의 목표: Phong 조명 모델의 주변광(ambient)·확산광(diffuse)·반사광(specular) 세 항을 실제 벡터와 숫자로 대입해 한 점의 밝기를 계산할 수 있고, 법선·광원·시선·반사 벡터 각각이 조명 계산에서 어떤 역할을 하는지 설명할 수 있게 된다.

왜 밝기를 수식으로 계산해야 하는가

09·10편에서 곡면을 만들고 어떤 면이 보이는지 걸러냈다면, 이제 남은 문제는 “그 면이 화면에서 얼마나 밝게 보여야 하는가”입니다. 같은 흰색 공이라도 빛을 정면으로 받는 부분은 하얗게 반짝이고, 빛을 비스듬히 받는 부분은 어둡게 보이며, 광원과 반대쪽은 그림자처럼 거의 검게 보입니다. 이 명암 차이를 계산 없이 화가처럼 손으로 칠할 수는 없으므로, 컴퓨터그래픽스는 광원·표면·시점의 기하학적 관계를 수식으로 정리한 조명 모델(Lighting Model, Illumination Model)을 사용합니다.

가장 널리 쓰이는 것이 1975년 부이 뜨엉 퐁(Bui Tuong Phong)이 제안한 Phong 조명 모델입니다. 이 모델은 실제 물리 법칙을 정밀하게 시뮬레이션하는 대신, 눈에 그럴듯해 보이는 결과를 적은 계산으로 얻도록 설계된 경험적(empirical) 모델입니다.

쉽게 말하면: Phong 조명 모델은 한 점의 밝기를 “빛이 없어도 은은하게 보이는 몫” + “빛을 정면으로 받을수록 밝아지는 몫” + “눈부신 하이라이트가 생기는 몫” 세 가지를 더해서 계산하는 공식입니다.

1. Phong 모델의 세 가지 항

Phong 모델은 한 점에서의 최종 밝기 II를 세 항의 합으로 정의합니다.

I=Iaka+Ilkd(NL)+Ilks(RV)nI = I_a k_a + I_l k_d (\vec{N} \cdot \vec{L}) + I_l k_s (\vec{R} \cdot \vec{V})^n
  • II: 계산하려는 점의 최종 밝기(intensity)
  • IaI_a: 장면 전체에 고르게 퍼져 있는 주변광(ambient light)의 세기
  • kak_a: 표면이 주변광을 얼마나 반사하는지 나타내는 주변광 반사 계수(0에서 1 사이)
  • IlI_l: 광원(light source) 자체의 세기
  • kdk_d: 표면이 확산광을 얼마나 반사하는지 나타내는 확산 반사 계수(0에서 1 사이)
  • N\vec{N}: 표면의 법선 벡터(단위 벡터, 크기 1로 정규화됨)
  • L\vec{L}: 표면의 점에서 광원을 향하는 벡터(단위 벡터)
  • ksk_s: 표면이 반사광(하이라이트)을 얼마나 반사하는지 나타내는 반사 계수(0에서 1 사이)
  • R\vec{R}: 광원에서 온 빛이 표면에서 정반사(mirror reflection)되어 나가는 방향 벡터(단위 벡터)
  • V\vec{V}: 표면의 점에서 시점(카메라)을 향하는 벡터(단위 벡터)
  • nn: 광택 지수(shininess exponent). 값이 클수록 하이라이트가 작고 날카로워진다

주변광(Ambient) 항 — 빛이 안 닿아도 어둡지 않게

쉽게 말하면: 방 안의 형광등을 하나만 켜도 그 빛이 벽에 반사되어 방 전체가 은은하게 밝은 것처럼, 광원이 직접 닿지 않는 면도 완전히 검게 보이지 않도록 더해 주는 항입니다.

실제 장면에서는 빛이 벽이나 다른 물체에 여러 번 반사되어 광원이 직접 비추지 않는 곳도 어느 정도 밝습니다. 이런 간접광을 물리적으로 정밀하게 계산하려면 매우 비싼 전역 조명(global illumination) 계산이 필요하므로, Phong 모델은 이를 장면 전체에 걸린 상수 IakaI_a k_a로 단순화해서 대신합니다.

확산광(Diffuse) 항 — 빛의 각도가 밝기를 정한다

쉽게 말하면: 손전등을 표면에 똑바로 비추면 밝고, 표면을 스치듯 비스듬히 비추면 어두워지는 것처럼, 빛과 표면이 이루는 각도로 밝기를 정하는 항입니다.

확산광 항은 람베르트 코사인 법칙(Lambert’s Cosine Law)에 따라 NL\vec{N} \cdot \vec{L}, 즉 법선 벡터와 광원 벡터의 내적으로 계산됩니다. 두 벡터가 모두 단위 벡터일 때 내적은 두 벡터 사이 각도 θ\theta에 대해 cosθ\cos\theta와 같으므로, 빛이 표면에 수직으로(θ=0\theta = 0) 닿으면 cos0=1\cos 0 = 1로 가장 밝고, 표면과 나란하게(θ=90°\theta = 90°) 스치면 cos90°=0\cos 90° = 0으로 전혀 밝아지지 않습니다. 이 항은 거친 무광 표면(예: 종이, 석고)처럼 빛을 모든 방향으로 고르게 흩어 보내는 반사를 표현하며, 시점 V\vec{V}의 위치와는 무관하다는 특징이 있습니다.

반사광(Specular) 항 — 하이라이트가 생기는 이유

쉽게 말하면: 매끈한 사과 표면에 생기는 반짝이는 하얀 점처럼, 빛이 거울처럼 튕겨 나가는 방향과 눈이 있는 방향이 거의 일치할 때만 눈부시게 밝아지는 항입니다.

반사광 항은 정반사 방향 벡터 R\vec{R}과 시선 벡터 V\vec{V}의 내적 (RV)(\vec{R} \cdot \vec{V})을 광택 지수 nn만큼 거듭제곱합니다. R\vec{R}V\vec{V}가 정확히 일치하면(θ=0\theta = 0) 값이 1이 되어 가장 밝고, 조금만 벗어나도 nn이 클수록 값이 급격히 줄어듭니다. 이 때문에 nn이 크면 아주 좁고 날카로운 하이라이트(플라스틱·금속처럼 매끈한 표면)가 생기고, nn이 작으면 넓고 흐릿한 하이라이트(고무처럼 덜 매끈한 표면)가 생깁니다. 확산광과 달리 반사광 항은 시점 V\vec{V}의 위치에 따라 값이 달라져, 같은 물체라도 보는 각도를 바꾸면 하이라이트의 위치가 함께 움직입니다.

2. 실제 계산 — Phong 식에 숫자를 대입하기

표면 위의 한 점에서 법선 벡터가 N=(0,0,1)\vec{N} = (0, 0, 1)(정면을 바로 향함)이고, 광원이 그 점에서 볼 때 (1,1,1)(1, 1, 1) 방향에 있다고 하겠습니다. 먼저 광원 벡터를 단위 벡터로 정규화합니다.

Lraw=12+12+12=31.732|\vec{L}_{raw}| = \sqrt{1^2 + 1^2 + 1^2} = \sqrt{3} \approx 1.732 L=(11.732,11.732,11.732)(0.577, 0.577, 0.577)\vec{L} = \left(\frac{1}{1.732}, \frac{1}{1.732}, \frac{1}{1.732}\right) \approx (0.577,\ 0.577,\ 0.577)

확산광 항 계산

법선과 광원 벡터의 내적을 구합니다.

NL=(0×0.577)+(0×0.577)+(1×0.577)=0.577\vec{N} \cdot \vec{L} = (0 \times 0.577) + (0 \times 0.577) + (1 \times 0.577) = 0.577

주변광 세기 Ia=1I_a = 1, 주변광 반사 계수 ka=0.2k_a = 0.2, 광원 세기 Il=1I_l = 1, 확산 반사 계수 kd=0.6k_d = 0.6이라 하고 확산광 항을 계산합니다.

Ilkd(NL)=1×0.6×0.577=0.346I_l k_d (\vec{N} \cdot \vec{L}) = 1 \times 0.6 \times 0.577 = 0.346

반사광 항 계산 — 반사 벡터 구하기

반사 벡터 R\vec{R}은 다음 공식으로 구합니다.

R=2(NL)NL\vec{R} = 2(\vec{N} \cdot \vec{L})\vec{N} - \vec{L}
  • 2(NL)N2(\vec{N} \cdot \vec{L})\vec{N}: 법선 방향으로 L\vec{L}을 거울처럼 뒤집기 위한 보정 항
  • 이 식은 입사각과 반사각이 법선을 기준으로 같다는 반사 법칙을 벡터로 표현한 것이다.

2(NL)=2×0.577=1.1542(\vec{N} \cdot \vec{L}) = 2 \times 0.577 = 1.154이므로,

R=1.154×(0,0,1)(0.577,0.577,0.577)=(0.577, 0.577, 0.577)\vec{R} = 1.154 \times (0, 0, 1) - (0.577, 0.577, 0.577) = (-0.577,\ -0.577,\ 0.577)

시점이 표면 바로 정면(V=(0,0,1)\vec{V} = (0, 0, 1))에 있다고 하면, 반사 벡터와 시선 벡터의 내적은 다음과 같습니다.

RV=(0.577×0)+(0.577×0)+(0.577×1)=0.577\vec{R} \cdot \vec{V} = (-0.577 \times 0) + (-0.577 \times 0) + (0.577 \times 1) = 0.577

광택 지수 n=4n = 4, 반사 계수 ks=0.5k_s = 0.5라 하고 이 값을 거듭제곱합니다.

(RV)4=0.57740.111(\vec{R} \cdot \vec{V})^4 = 0.577^4 \approx 0.111

반사광 항을 계산합니다.

Ilks(RV)n=1×0.5×0.111=0.056I_l k_s (\vec{R} \cdot \vec{V})^n = 1 \times 0.5 \times 0.111 = 0.056

세 항을 더해 최종 밝기 구하기

주변광 항을 계산합니다.

Iaka=1×0.2=0.2I_a k_a = 1 \times 0.2 = 0.2

세 항을 모두 더합니다.

I=0.2+0.346+0.056=0.602I = 0.2 + 0.346 + 0.056 = 0.602
  • 결과: 이 점의 최종 밝기는 약 0.6020.602이다(밝기 값이 0에서 1 사이로 정규화되어 있다고 가정할 때, 중간보다 조금 밝은 수준). 주변광 0.20.2가 바탕을 깔고, 법선과 광원이 이루는 각도(약 54.7°54.7°, cos1(0.577)\cos^{-1}(0.577))만큼 확산광 0.3460.346이 더해지며, 시선이 반사 방향과 정확히 겹치지 않아 반사광은 0.0560.056으로 비교적 작게 기여했다.

자주 틀리는 점: NL\vec{N} \cdot \vec{L}이 음수로 나오는 경우를 그대로 계산에 넣는 실수가 흔합니다. 내적이 음수라는 것은 광원이 표면의 뒤쪽에 있어 그 표면에 빛이 전혀 닿지 않는다는 뜻이므로, 확산광과 반사광 항은 00으로 처리해야 합니다(즉 max(0,NL)\max(0, \vec{N} \cdot \vec{L})을 사용). 이를 무시하고 음수를 그대로 더하면 밝기가 오히려 줄어드는 잘못된 결과가 나옵니다.

3. 조명 계산의 흐름

비유: 캄캄한 방에서 손전등 하나로 매끈한 도자기 그릇을 비춰 보는 상황을 떠올려 보세요. 방 안이 완전히 캄캄하지 않은 것은 벽에 반사된 은은한 빛(주변광) 덕분이고, 손전등을 그릇 표면에 똑바로 비출수록 그 부분이 밝아지는 것은 확산광 때문이며, 특정 각도에서만 눈부시게 반짝이는 점이 보이는 것은 반사광(하이라이트) 때문입니다.

핵심 정리

  • Phong 조명 모델은 밝기 II를 주변광(IakaI_a k_a), 확산광(Ilkd(NL)I_l k_d (\vec{N} \cdot \vec{L})), 반사광(Ilks(RV)nI_l k_s (\vec{R} \cdot \vec{V})^n) 세 항의 합으로 계산한다.
  • 확산광 항은 법선과 광원 벡터의 내적(코사인 값)으로 계산되며 시점과 무관하고, 반사광 항은 반사 벡터와 시선 벡터의 내적을 광택 지수만큼 거듭제곱해 계산되며 시점에 따라 값이 달라진다.
  • 반사 벡터는 R=2(NL)NL\vec{R} = 2(\vec{N} \cdot \vec{L})\vec{N} - \vec{L}로 구하며, 이는 입사각과 반사각이 같다는 반사 법칙을 벡터로 표현한 것이다.
  • 광택 지수 nn이 클수록 하이라이트가 좁고 날카로워지고, 작을수록 넓고 흐릿해진다.
  • NL\vec{N} \cdot \vec{L}이 음수이면 광원이 표면 뒤에 있다는 뜻이므로 확산광·반사광 항을 0으로 처리해야 한다.

마무리 복습

문제 14지선다
Phong 조명 모델에서 최종 밝기를 이루는 세 항으로 가장 적절한 것은?
문제 24지선다
확산광 항이 N·L(법선과 광원 벡터의 내적)로 계산되는 이유로 가장 적절한 것은?
문제 34지선다
법선 벡터 N=(0,0,1)과 광원 벡터 L=(0.577, 0.577, 0.577)의 내적 N·L로 가장 적절한 것은?
문제 44지선다
본문의 예시에서 Ia=1, ka=0.2, Il=1, kd=0.6, N·L=0.577일 때 확산광 항의 값으로 가장 적절한 것은?
문제 54지선다
반사 벡터 R을 구하는 공식으로 가장 적절한 것은?
문제 64지선다
광택 지수 n이 커질수록 하이라이트(반사광이 강하게 보이는 영역)에 나타나는 변화로 가장 적절한 것은?

참고 자료

Last updated on