컴퓨터과학/컴퓨터그래픽스
[컴퓨터그래픽스] 3D 조명: Local/Global Illumination, Phong 반사 모델
깃짱
2025. 10. 23. 15:00
반응형
🌏 조명(Lighting)
3D 그래픽스에서 "조명"은 단순히 화면을 밝게 만드는 게 아닙니다. 입체감을 만들고, 소재의 질감을 표현하고, 장면의 분위기를 결정짓는 핵심 요소입니다.
실제로는 광원의 위치, 표면의 재질, 관찰자의 시점이 결합되어 물체의 입체감과 사실감을 결정짓습니다.
즉, 조명은 “렌더링의 질”을 좌우하는 핵심 요소입니다.
이 포스팅에서는 Local/Global 조명, Phong 모델, 셰이딩 기법에 대해서 다루려고 합니다.
✅ Local vs Global Illumination
- Local Illumination (직접 조명)
- 조명과 물체 간의 직접적인 상호작용만 고려합니다.
- 반사, 투과, 그림자 등의 간접 조명은 무시합니다.
- 예. Phong 모델, Cook-Torrance 모델
- Global Illumination (간접 조명 포함)
- 조명뿐 아니라 다른 표면에서 반사된 빛도 고려합니다.
- 보다 현실적이지만 계산량이 많음
- 예. Ray tracing, Radiosity
Local은 손전등처럼 직접 비추는 빛만, Global은 벽에서 반사돼 다시 들어오는 빛까지 생각하는 방식입니다.
✅ Phong 반사 모델
Phong 모델은 현실적인 조명을 간단한 수학으로 근사한 대표적인 로컬 조명 모델입니다. 세 가지 성분을 더해서 최종 색상을 만듭니다

1. Ambient (환경광)
- 주변에 퍼져 있는 일관된 빛
- 물체가 어디에 있든 항상 일정한 밝기
I_ambient = k_a * I_ak는 가중치
2. Diffuse (난반사광)
- 물체 표면이 거칠어서 빛을 여러 방향으로 퍼뜨리는 효과
- 입사각이 작을수록 밝게 보임 (램버트 법칙)
I_diffuse = k_d * I_l * max(0, N · L)N: 표면의 법선 벡터L: 빛의 방향
3. Specular (정반사광)
- 표면이 반들반들할 때 생기는 하이라이트
- 관찰자 방향에 따라 밝기가 달라짐
- 계산 식:
R: 반사 벡터V: 시선 벡터n: shininess 계수 (클수록 날카롭고 작은 하이라이트)
I_specular = k_s * I_l * (R · V)^n
이 세가지를 모두 합하면 Phong Reflection 값이 된다!!!
✅ Specular Reflection에서 n의 영향
n이 클수록 하이라이트가 작고 날카로워집니다.n이 작으면 넓게 퍼지고 흐릿한 하이라이트가 나타납니다.
예를 들어, 금속처럼 반들거리는 물체는 n이 큽니당
✅ 셰이딩 기법: Gouraud vs Phong
셰이딩(Shading)은 조명 모델을 다각형에 적용하는 방식을 말합니다.
| 셰이딩 기법 | 설명 | 특징 |
|---|---|---|
| Gouraud | 정점에서 색상을 계산하고, 픽셀에 보간 | 빠름, 부드럽지만 하이라이트 표현 약함 |
| Phong | 정점에서 법선 벡터를 보간하여 픽셀마다 조명 계산 | 느리지만 정밀한 하이라이트 표현 가능 |
✔ Gouraud: 색상을 보간
✔ Phong: 법선 벡터를 보간
✅ Flat vs Smooth Shading
- Flat Shading
- 삼각형 하나마다 하나의 법선 벡터 사용 → 각지게 표현
- 각 면마다 다른 색상 → 다소 투박 (완성도 겁나 낮아보임)
- Smooth Shading
- 정점에서의 법선을 보간하여 부드럽게 연결
- 곡면 같은 느낌을 줄 수 있음
WebGL에서는 보통 Phong + Smooth 조합을 많이 씁니다.
조명에 대해서 구체적으로 계산할 때 근사하는 식도 있습니다만 이건 개발을 위한 개념 이해에는 그닥 필요 없다고 생각해 스킵하겠습니다!

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
반응형