lighting에는
빛이 한 방향으로 반사되는 정반사(Specular Reflection)와
여러 방향으로 고르게 반사되는 난반사(Diffuse Reflection)가 있다.
오늘은 난반사의 개념과
난반사의 표면 빛 세기를 수학적으로 모델링한
램버튼 법칙에 대해서 정리하고자 한다.
빛의 세기와 색상을 결합하는
Diffuse Shading 단계는
이론적으로만 짧게 언급할 예정이다.
Diffuse Reflection (난반사, 확산 반사)
빛이 표면에 닿았을 때, 모든 방향으로 고르게 산란되어 어느 방향에서 보더라도 비슷한 밝기를 보이는 현상으로, 표면이 거칠거나 불규칙적(종이, 콘크리트, 매트 처리된 표면 등)일 때 일어난다. 빛이 닿은 표면이 거칠고 요철이 많아 미세한 면에서 빛이 여러 방향으로 반사되고, 합쳐진 결과가 모든 방향으로 퍼지는 것처럼 보인다. 이상적인 난반사 표면을 Lambertian surface라고 부르며, 난반사를 수학적으로 모델링한 이론이 바로 램버트 법칙(Lambert’s cosine law)이다.
난반사의 특징
- 난반사는 보는 위치와 상관 없이 동일한 밝기를 보인다.
어떠한 물체의 색을 본다는 것은 해당 물체에 반사된 색을 보게 되는 것인데, 난반사의 특징은 관찰자가 어디에서 보든지 거의 동일한 밝기를 보게 되는 것이다. 관찰자의 위치가 달라지더라도 보여지는 밝기는 동일하기 때문에 표면이 매트한 것 처럼 나타난다. - 난반사의 빛의 세기는 입사각에 의해 정해진다.
빛이 수직으로 닿으면 강하게 반사되고, 비스듬하게 닿으면 약하게 만사된다. 이는 표면에 도달하는 단위면적당 빛 에너지가 줄어들기 때문이다.
정반사 vs 난반사
| 구분 | 정반사 (Specular) | 난반사 (Diffuse) |
| 반사 방향 | 특정한 반사각 방향으로 집중 | 모든 방향으로 균일 |
| 관찰자 영향 | 있음 (각도에 따라 반짝임 다름) | 없음 (어디서 봐도 비슷) |
| 예시 | 거울, 금속, 유리, 물 | 종이, 콘크리트, 매트 페인트 |
램버트 법칙 (Lambert’s cosine law)

램버트 법칙은 난반사(Diffuse) 표면에서의 빛 강도를 수학적으로 모델링 한 이론으로, 빛의 세기는 물체 표면의 법선과 광원 방향 사이의 각도(cos)에 비례한다고 나타낸다.
빛의 세기(Intensity) = 법선과 광원 방향 벡터의 내적, N과 L의 코사인 세타 값

물체의 표면에서 수직으로 뻗어나가는 단위벡터를 N(법선, normal), 표면에서부터 광원까지의 방향을 나타내는 단위벡터를 L(광원 방향 벡터, linght Direction)이라고 한다. 빛의 세기는 이 두 벡터의 각도에 비례하며 코사인 세타값이 바로 빛의 세기가 된다. 공식으로 풀어서 보면 N벡터와 L벡터를 내적한 값이 빛의 세기라고 한다. 그런데 코사인 세타 값이 바로 결과(빛의 세기)가 되는 것일까?


벡터 내적(Dot)은 두 벡터의 길이와 코사인 세타의 값을 곱한 값과 같다. 여기서 N(법선)과 L(광원 방향 벡터)는 모두 단위벡터이기 때문에 길이가 1이고 내적의 결과는 1 * 1* 코사인 세타값과 동일하다. 즉, 내적의 결과값이 코사인 세티값과 동일하기 때문에 빛의 세기는 N벡터와 L벡터의 코사인 세타 값이라고 하는 것이다.
빛의 세기와 코사인 값의 의미
| 각도 | 0 | 30 | 45 | 60 | 90 |
| Cos | 1 | 루트3/2 | 루트2/2 | 1/2 | 0 |
코사인은 각도가 작을수록 크고, 각도가 클수록 작아진다. 이는 난반사의 특징인 ‘난반사의 빛의 세기는 입사각에 의해 정해진다.’와 동일하다. 표면의 법선벡터와 광원 방향 벡터 사이의 각도(세타)값이 작아질수록 단위면적당 받는 빛과 튕겨내는 빛의 양이 많아져 빛의 세기는 강해지고, 반대로 각도가 크다면 광원이 측면에서 비스듬히 들어온다는 말이기 때문에 빛의 세기가 약해진다.
Diffuse Shading
Diffus Shading은 3D 그래픽스에서 표면 난반사 빛의 세기(Intensity)와 색상(Color)을 결합하여 최종 픽셀 색상을 계산하는 과정이다. 램버튼 모델은 빛의 세기(Intensity)만을 나타낸다. 표면을 나타낼 최종 색상은 이 빛의 세기에 Color값까지 함께 곱해주어야 한다.
![]()
Color = 광원색 x 재질색

Sd와 Md는 모두 RGB값을 가진 벡터이다. 이 둘을 성분곱하면 Color가 도출된다.
최종 색상 = Intensity x Color
Intensity (스칼라값) x Color(벡터) 연산을 통해 색상과 난반사 강도가 결합된 최종 색상을 구할 수 있다.
예제) 난반사에서 어느 한 표면의 픽셀 색상을 계산해야한다고 할때 그 과정과 결과는?
- N : (0,0,1)
- L : (0, 0.6, 0.8)
- Sd : (1, 0.5, 0.5)
- Md : (0.2, 0.6, 1.0)
1. 빛의 세기 계산
N과 L의 내적 : (0,0,1) ⋅ (0,0.6,0.8) = 0∗0+0∗0.6+1∗0.8 = 0.8ㅁ
2. 색상 계산
Sd와 Md의 성분곱 : (1∗0.2, 0.5∗0.6, 0.5∗1.0) = (0.2,0.3,0.5)
3. 최종 색상 계산
빛의 세기와 색상 결합 : 0.8 * (0.2,0.3,0.5) = (0.16,0.24,0.4)
'Programming > 컴퓨터그래픽스 (DX 11)' 카테고리의 다른 글
| [DirectX 11] 상수버퍼(Constant Buffer) CPU 구조체와 HLSL 구조체 정렬 맞추기 (0) | 2025.09.16 |
|---|---|
| [DirectX 11] DirectXMath vs SimpleMath 어떤 자료형을 사용해야할까? (0) | 2025.09.15 |
| [DirectX 11] D3D11 렌더 타겟 뷰(RTV)와 SwapChain 개념 (0) | 2025.09.10 |
| [DirectX 11] 2D 변환 행렬 (0) | 2025.06.11 |
| [DirectX 11] DirectX의 행렬 활용을 위한 2D 기본 행렬 복습 (0) | 2025.06.11 |