| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- RNN
- Process
- Seoul National University
- Baekjoon
- do it! 알고리즘 코딩테스트: c++편
- On-memory file system
- Python
- Robocup@Home 2026
- Linux
- Data Science
- CNN
- DFS
- file system
- Machine Learning
- Optimization
- Humble
- ROS2
- Gentoo2
- computer vision
- System Call
- cs231n
- Multimedia
- BFS
- CPP
- SQLD
- deep learning
- paper review
- 밑바닥부터 시작하는 딥러닝2
- Operating System
- C++
- Today
- Total
newhaneul
[Multimedia] Lecture 9. Lighting 본문
본 포스팅은 인하대학교 안남혁 교수님의 [202601-EEC4410-001] Multimedia을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.

조명(Lighting/Illumination)은 빛과 물체 사이의 상호작용을 다루는 기법이며, Phong Lighting model은 대표적인 지역 조명(Local illumination) 모델이다.
Phong Lighting Model
조명 기법은 빛과 물체의 상호작용을 처리하며, 이 중 퐁 모델은 대표적인 지역 조명(Local illumination) 모델이다. 이 모델은 다음 4가지 요소의 합으로 조명을 계산한다.
-
난반사 (Diffuse Term): 램버트 법칙(Lambert's law)을 기반으로 한다. 빛이 표면에 닿았을 때 모든 방향으로 동일한 강도로 산란되므로, 관찰자의 시점과 무관하게(view-independent) 동일한 밝기로 보인다. 표면의 법선 벡터($n$)와 빛의 방향 벡터($l$)가 이루는 각도($\theta$)가 좁아질수록 더 많은 빛을 받으며, 이는 $cos\theta$ 즉, $n\cdot l$에 비례한다.
-
정반사 (Specular Term): 표면이 반짝이게 보이는 하이라이트 효과를 표현한다. 난반사와 달리 관찰자의 시점에 의존적(view-dependent)이다. 반사 벡터($r$)와 시선 벡터($v$) 사이의 각도를 기반으로 하며, 물체의 광택도(shininess, $sh$)를 지수로 사용하여 빛이 급격히 감소하는 현상을 $(r\cdot v)^{sh}$로 근사한다.
-
주변광 (Ambient Term): 장면 내의 다른 여러 물체에 반사되어 간접적으로 도달하는 빛을 의미한다. 빛이 여러 번 반사되어 사방에서 들어오므로, 표면에서도 모든 방향으로 동일한 강도로 반사되는 것으로 모델링된다.
- 발산광 (Emissive Term): 외부 빛의 반사가 아니라 표면 자체가 스스로 방출하는 빛의 양을 나타낸다.
Phong Lighting Model - Diffuse Term

- 난반사는 램버트 법칙(Lambert's law)을 기초로 한다.
- 이상적인 난반사 표면에 빛이 입사하면, 그 빛은 표면에서 모든 방향으로 동일한 강도로 산란(scattered)된다.
- 따라서 관찰자가 카메라를 통해 어느 방향에서 물체를 바라보더라도(view-independent) 표면의 특정 지점은 똑같은 밝기로 보인다.
- 결과적으로 우리 눈에 인지되는 반사광의 양은 관찰자의 시선 방향과는 무관하며, 오로지 표면에 들어오는 빛의 양에만 비례하게 된다.

- 표면에 도달하는 빛의 양은 빛이 표면과 이루는 각도에 따라 달라진다. 이를 계산하기 위해 두 가지 벡터를 사용한다.
- $n$: 표면의 수직 방향을 나타내는 법선 벡터(Surface normal)
- $l$: 표면의 점 $p$에서 광원(Light source)을 향하는 빛 벡터(Light vector)
- 두 벡터 사이의 각도를 $\theta$라고 할 때, $\theta$가 작아질수록(즉, 빛이 표면에 수직에 가깝게 내리쬘수록) 점 $p$는 더 많은 빛을 받는다. 이 빛의 입사량은 $\cos\theta$에 비례한다.
- 계산의 편의를 위해 $n$과 $l$을 크기가 1인 단위 벡터(unit vector)로 가정하면, 두 벡터의 내적(dot product) 연산 결과가 곧 $\cos\theta$가 된다.
$$n \cdot l = |n||l|\cos\theta = \cos\theta$$ - Clipping: 만약 빛이 표면의 뒤쪽에서 비추는 경우($\theta > 90^\circ$), 내적 값 $n \cdot l$은 음수가 나온다. 하지만 현실에서 물리적인 빛의 강도가 음수가 될 수는 없으므로, 계산값이 0보다 작을 때는 강도를 0으로 처리해 주어야 한다. 이를 위해 $\max$ 함수를 사용하여 최종 빛의 강도 계수를 다음과 같이 정의한다.
$$\max(n \cdot l, 0)$$

해당 슬라이드는 앞서 구한 빛의 강동[ 색상(Color)을 입히는 과정을 다룬다.
- 빛 자체의 강도와 색상을 $s_d$라고 하고, 물체 표면의 고유한 재질 속성(Material parameter)을 $m_d$라고 한다. $m_d$는 주로 텍스처(Texture) 이미지로부터 값을 가져온다.
- 물체가 붉게 보인다는 것은 RGB 중 Red 파장만 반사하고 Green과 Blue는 흡수한다는 뜻이다. 슬라이드의 예시처럼 강도 1의 백색광 $(1, 1, 1)$이 붉은색 재질 $m_d = (1, 0, 0)$에 부딪히면, 각 채널별로 곱셈이 일어나 최종적으로 $(1, 0, 0)$의 빛만 반사된다.
- 이처럼 빛의 색상 벡터와 재질 벡터를 각각의 성분별로 곱하는 연산을 $\otimes$ (component-wise multiplication) 기호로 표현한다.
$$s_d \otimes m_d$$
최종 난반사 수식 정리 (Diffuse Term)
Phong Lighting model에서 난반사광의 최종 색상과 밝기를 결정하는 수식은 다음과 같이 완성된다.
$$\text{Diffuse Term} = \max(n \cdot l, 0) \cdot s_d \otimes m_d$$
이 수식은 빛이 표면에 부딪히는 각도에 따른 물리적 밝기 변화($\max(n \cdot l, 0)$)와, 광원과 물체 표면 간의 색상 상호작용($s_d \otimes m_d$)을 곱하여 최종적인 픽셀의 난반사 색상을 계산해 내는 공식이다.
Phong Lighting Model - Specular Term

정반사 항(Specular Term)은 표면에 맺히는 하이라이트(highlight)를 통해 물체가 반짝이거나 매끄럽게 보이도록 만드는 역할을 한다.
- 이를 계산하기 위해서는 빛이 표면에 부딪혀 반사되어 나가는 반사 벡터($r$)와, 관찰자가 표면의 점을 바라보는 시선 벡터($v$)가 필요하다.
- 반사 벡터 $r$의 수학적 도출:
빛의 입사 벡터를 $l$, 표면의 법선 벡터를 $n$이라고 할 때, 기하학적 투영을 통해 $r$을 구할 수 있다. 모든 벡터를 단위 벡터로 가정하면, $l$을 $n$ 방향으로 투영한 성분의 길이는 $\cos\theta$가 된다.
법선 방향의 벡터 $n\cos\theta$를 기준으로 수평 방향의 중간 벡터 $s$를 정의하면 다음과 같은 관계가 성립한다.
마찬가지로 반사 벡터 $r$에서 수직 성분 $n\cos\theta$를 빼도 동일한 수평 벡터 $s$가 나온다.$$s = n\cos\theta - l$$
이 두 식을 연립하여 $r$에 대해 정리하면 다음과 같이 도출된다.$$s = r - n\cos\theta$$
$$r = n\cos\theta + s = n\cos\theta + (n\cos\theta - l)$$$$r = 2n\cos\theta - l$$
여기서 $\cos\theta$는 두 단위 벡터 $n$과 $l$의 내적($n \cdot l$)과 같으므로, 최종적인 반사 벡터 공식은 다음과 같이 정리된다.
$$r = 2n(n \cdot l) - l$$

- 난반사(Diffuse)가 어느 각도에서 보든 동일한 밝기였던 것과 달리(view-independent), 정반사로 인한 하이라이트는 관찰자의 위치에 따라 다르게 보인다(view-dependent).
- 완벽한 거울 같은 표면이라면 시선 벡터 $v$와 반사 벡터 $r$이 정확히 일치할 때(두 벡터 사이의 각도 $\rho = 0$)에만 하이라이트가 보인다.
- 하지만 일반적인 광택 표면에서는 $\rho = 0$일 때 하이라이트가 가장 강하고, $\rho$가 커질수록 빛의 강도가 급격히 감소(fall-off)한다.
- 이 급격한 감소 현상을 코사인 함수의 거듭제곱을 사용하여 수학적으로 근사한다. 두 단위 벡터 $r$과 $v$의 내적이 $\cos\rho$이므로, 여기에 광택도를 나타내는 지수 $sh$(shininess)를 적용한다.
$$(r \cdot v)^{sh}$$ - 슬라이드 우측의 그래프를 보면 $sh$ 값이 1, 2, 64로 커질수록 그래프가 0으로 더 급격하게 떨어지는 것을 알 수 있다. 즉, $sh$ 값이 클수록 하이라이트가 좁고 선명하게 맺히며 더 매끄러운 재질을 표현하게 된다.
** 2025-1 중간고사 **

- 정답: 하이라이트가 좁아진다.

최종 정반사 수식 정리 (Specular Term)
Phong Lighting model에서 정반사의 최종 색상과 밝기를 결정하는 수식은 다음과 같이 완성된다.
$$\text{Specular Term} = (\max(r \cdot v, 0))^{sh} \cdot s_s \otimes m_s$$
- 하이라이트는 $r \approx v$인 지점, 즉 빛이 반사되어 곧바로 눈으로 들어오는 곳에서 가장 강하게 나타난다.
** 2025-1 중간고사 **

- 정답:
- sh = 5 $\rightarrow$ 넓은 원뿔형 음영 $\rightarrow$ 넓게 퍼져 있는 하이라이트
- sh = 20 $\rightarrow$ 좁은 원뿔형 음영 $\rightarrow$ 좁게 퍼져 있는 하이라이트
Phong Lighting Model - Ambient Term

- 현실 세계에서 빛은 광원에서 나와 물체에 한 번만 부딪히고 끝나는 것이 아니라, 바닥, 벽, 다른 물체들에 끊임없이 반사되어 공간 전체를 채운다. 이렇게 씬(Scene) 내의 여러 객체에 부딪혀 산란된 빛을 주변광이라고 한다.
- 빛이 워낙 많이 튕겨 다녔기 때문에, 물체 표면의 특정 점($p$)에는 사실상 모든 방향에서 빛이 도달하게 된다. 따라서 표면에서 반사될 때도 모든 방향으로 동일한 강도로 산란되며, 관찰자의 시선 위치나 광원의 직접적인 위치에 영향을 받지 않는다.
최종 주변광 수식 정리 (Ambient Term)
- $s_a$: 장면(Scene) 전체에 깔려 있는 기본 주변광의 강도와 색상이다.
- $m_a$: 물체 표면이 주변광을 얼마나 반사하는지를 나타내는 재질 파라미터이다.
Phong Lighting Model - Emissive Term

- 발산광은 외부의 광원(태양, 전구 등)으로부터 빛을 받아서 반사하는 것이 아니라, 물체의 표면 자체가 에너지를 방출하여 빛을 내는 양을 의미한다.
- 스스로 내는 빛이므로 외부 빛의 입사각($l$)이나 관찰자의 시선($v$)과 무관하게 표면의 본래 발광 색상 그대로 카메라(눈)에 전달된다.
최종 발산광 수식 정리 (Emissive Term)
$$\text{Emissive Term} = m_e$$
- $m_e$: 물체가 스스로 방출하는 빛의 색상과 강도를 나타내는 재질 파라미터이다.

지금까지 구한 Term들을 모두 합하여 Phong Lighting Model 수식을 구하면 아래와 같다.
최종 Phong Lighting Model 수식

- 정답:
- Phong Lighting Model:
$$max(n \cdot l, 0) \cdot s_d \otimes m_d + (\max(r \cdot v, 0))^{sh} \cdot s_s \otimes m_s + s_a \otimes m_a + m_e$$ - 4가지 조명 성분:
- 난반사 (Diffuse Term): 빛이 이상적인 표면에서 모든 방향으로 동일한 각도로 산란되는 성분이다. 표면의 법선 벡터($n$)와 빛의 방향 벡터($l$)가 이루는 각도에 비례하여 밝기가 결정된다.
- 정반사 (Specular Term): 물체 표면에 맺히는 반짝이는 하이라이트를 통해 광택을 표현하는 성분이다. 관찰자의 시선 벡터($v$)와 반사 벡터($r$)의 각도에 의존적이며, 재질의 광택도($sh$)에 따라 하이라이트의 선명도가 조절된다.
- 주변광 (Ambient Term): 씬(Scene) 내의 여러 물체에 반사되어 간접적으로 도달하는 조명 성분이다. 모든 방향에서 도달하여 모든 방향으로 산란되므로 물체의 기본 밝기를 보장하는 역할을 한다.
- 발산광 (Emissive Term): 외부 빛의 반사가 아니라 물체 표면 자체가 스스로 방출하는 빛의 양을 나타내는 성분이다.
- Phong Lighting Model:


Shading
음영은 앞서 설명한 조명 모델을 바탕으로 화면 픽셀의 최종 색상을 결정하는 과정이다. 계산 단위와 방식에 따라 크게 세 가지로 나뉜다.
- 플랫 셰이딩 (Flat Shading):
- 각 다각형(폴리곤)마다 단 하나의 면 법선(face normal)만을 사용한다.
- 다각형당 색상을 한 번만 계산하므로(constant shading) 연산 비용이 매우 저렴하다.
- 그러나 다각형 간의 경계선이 뚜렷하게 보여 곡면을 자연스럽게 표현하는 데는 한계가 있다.
- 고로 셰이딩 (Gouraud Shading):
- 정점(vertex) 단위로 조명을 계산하는 기법(per-vertex shading)이다.
- 각 정점의 법선을 이용해 조명 모델에 따른 색상을 먼저 구한 뒤, 다각형 내부 프래그먼트의 색상은 정점 색상들을 무게중심 보간(barycentric interpolation)하여 채운다.
- 플랫 셰이딩보다 사실적이지만, 정점에서만 조명을 계산하고 그 사이를 보간하므로 정반사 하이라이트가 중간에서 끊기거나 일관성 없이 나타나는 단점이 있다.
- 퐁 셰이딩 (Phong Shading):
- 픽셀(프래그먼트) 단위로 조명을 계산하는 기법(per-fragment shading)이다.
- 정점의 색상이 아닌, 정점의 법선 자체를 먼저 보간하여 각 프래그먼트마다 고유한 법선을 구한다. 그 후 각각의 프래그먼트 단위로 조명 모델을 계산한다.
- 하이라이트를 훨씬 정확하고 매끄럽게 표현하여 고품질의 결과를 내지만, 계산량이 가장 많다.

- 조명 (Lighting): 빛과 물체가 상호작용하는 물리적 현상을 수학적으로 계산하는 과정이다. 앞서 배운 퐁 조명 모델(Phong Lighting Model)이 대표적인 지역 조명(Local illumination) 모델에 해당한다.
- 음영 (Shading): 계산된 조명 모델을 바탕으로, 3D 객체를 2D 모니터 화면에 출력할 때 각 픽셀(Pixel)에 최종적으로 어떤 색상을 칠할지 결정하는 과정이다. 즉, 빛과 물체의 상호작용 결과를 화면에 시각적으로 표현하는 방법론이라 할 수 있다.
Shading - Flat Shading

- Flat Shading:
- 작동 원리: 3D 모델을 구성하는 각 Polygon마다 단 하나의 면 법선만을 사용한다.
- 장점: Polygon 내부의 픽셀마다 조명 연산을 반복할 필요가 없으므로 계산량이 적어 연산 비용이 매우 적다.
- 단점: Polygon과 Polygon 사이의 경계선이 시각적으로 뚜렷하게 드러나며 부드러운 곡면을 자연스럽게 표현하기에는 적합하지 않다.
Shading - Gouraud Shading


- Gouraud Shading (Per-Vertex Shading):
- 작동 원리: Polygon을 이루는 각 정점마다 고유한 법선을 사용한다. 정점에서 계산된 색상 값을 바탕으로, Polygon 내부의 픽셀 색상은 무게중심 보간법을 통해 서서히 채워진다.
- 장점: 내부를 보간하여 채우기 때문에 현실적이고 자연스러운 곡면을 표현할 수 있다.
- 단점: Flat Shading에 비해 모든 정점마다 연산을 수행하고 내부를 보간해야 하므로 계산 비용이 증가한다. 또한 정반사 하이라이트가 심하게 왜곡되거나 평균화되어 사라져 버리는 현상이 발생한다.

- 조명 계산이 오직 정점에서만 이루어지기 때문에, 빛이 반사되어 가장 밝게 빛나야 할 하이라이트의 중심이 다각형의 한가운데(정점과 정점 사이)에 떨어지면 이를 제대로 포착하지 못한다.
- 정점에서 계산된 어두운 색상들만을 가지고 내부를 '선형적으로(gradually)' 보간해 버리기 때문에, 가운데가 번쩍 빛나야 할 복잡한 변화를 표현할 수 없다.
- 결과적으로 빛이 닿는 곳이 정점 근처일 때만 하이라이트가 강하게 맺히고, 그 외의 부분에서는 약해져서 하이라이트가 뚝뚝 끊기거나(choppy), 표면이 매끄럽지 않게 보이게 된다.
Shading - Phong Shading


- Phong Shading (Per-Fragment Shading):
- 작동 원리: Rasterizer는 Polygon 내부의 각 fragment마다 고유한 법선 벡터를 도출한다. Phong shading은 이렇게 fragment마다 정교하게 보간된 법선 벡터를 바탕으로, fragment마다 조명 모델 수식을 개별적으로 계산한다.
- 장점: 조명 연산이 Polygon 내부의 모든 fragment에서 각각 이루어지기 때문에, 정반사 하이라이트를 매우 정확하게 포착할 수 있다.
- 단점: 수많은 fragment마다 조명 모델 공식을 전부 수행해야 하므로 계산 비용이 압도적으로 높다.
** 2024-2 중간고사 **

- 정답:
- Gouraud Shading (Per-Vertex Shading):
- 작동 원리:Polygon을 이루는 각 정점마다 고유한 법선을 사용한다. 정점에서 계산된 색상 값을 바탕으로, Polygon 내부의 픽셀 색상은 무게중심 보간법을 통해 서서히 채워진다.
- 장점: 내부를 보간하여 채우기 때문에 현실적이고 자연스러운 곡면을 표현할 수 있다.
- 단점: Flat Shading에 비해 모든 정점마다 연산을 수행하고 내부를 보간해야 하므로 계산 비용이 증가한다. 또한 정반사 하이라이트가 심하게 왜곡되거나 평균화되어 사라져 버리는 현상이 발생한다.
- Phong Shading (Per-Fragment Shading):
- 작동 원리: Rasterizer는 Polygon 내부의 각 fragment마다 고유한 법선 벡터를 도출한다. Phong shading은 이렇게 fragment마다 정교하게 보간된 법선 벡터를 바탕으로, fragment마다 조명 모델 수식을 개별적으로 계산한다.
- 장점: 조명 연산이 Polygon 내부의 모든 fragment에서 각각 이루어지기 때문에, 정반사 하이라이트를 매우 정확하게 포착할 수 있다.
- 단점: 수많은 fragment마다 조명 모델 공식을 전부 수행해야 하므로 계산 비용이 압도적으로 높다.
- Gouraud Shading (Per-Vertex Shading):
Gouraud vs. Phong Shading



각 Shading 방식이 렌더링 파이프라인(버텍스 셰이더 $\rightarrow$ 래스터라이저 $\rightarrow$ 프래그먼트 셰이더)에서 어떻게 다르게 작동하는지 다음과 같이 요약된다.
1. 플랫 셰이딩 (Flat Shading)
- Vertex Shader에서 폴리곤(삼각형)의 단일 법선 벡터를 이용해 조명을 계산한다.
- Rasterizer 단계에서 색상이나 법선의 보간(Interpolation)을 수행하지 않는다.
- Fragment Shader는 하나의 폴리곤 내에 있는 모든 픽셀(프래그먼트)에 동일한 단일 색상을 적용한다.
- 결과적으로 다각형의 각진 면이 뚜렷하게 보이게 되며, 각진 물체를 표현하거나 로우폴리(Low-poly) 스타일을 렌더링할 때 주로 활용된다.
- 조명 연산: Vertex Shader
- Rasterizer: 보간을 수행하지 않는다.
2. 고로 셰이딩 (Gouraud Shading)
- 정점 단위로 조명을 계산하므로 Per-vertex shading이라 불린다.
- Vertex Shader에서 각 정점(Vertex)의 법선 벡터를 이용해 정점별 색상을 우선적으로 계산한다.
- Rasterizer는 계산된 3개의 정점 색상을 기반으로 polygon 내부 fragment들의 색상을 부드럽게 선형 보간(Interpolate)한다.
- Fragment Shader는 단순히 보간된 색상을 화면에 출력하게 된다.
- Flat Shading보다 표면이 부드러워 보이지만, 정반사 하이라이트가 Polygon의 중앙에 맺힐 경우 정점 색상에 하이라이트가 반영되지 않아 하이라이트를 제대로 표현하지 못하는 한계가 존재한다.
- 조명 연산: Vertex Shader
- Rasterizer: Color을 보간한다.
3. 폰 셰이딩 (Phong Shading)
- fragment 단위로 조명을 계산하므로 Per-fragment shading이라 불린다.
- Vertex Shader는 조명을 계산하지 않고 정점의 법선 벡터만 다음 단계로 넘기게 된다.
- Rasterizer는 픽셀마다 정점의 법선 벡터 자체를 보간하여 각 프래그먼트 고유의 법선 벡터를 생성한다.
- Fragment Shader는 픽셀마다 보간된 법선 벡터를 이용해 조명 모델(Illumination model)을 개별적으로 계산하고 최종 색상을 결정한다.
- 픽셀 단위로 정교하게 계산하므로 연산 비용이 가장 크지만, 하이라이트와 곡면을 가장 부드럽고 사실적으로 표현한다.
- 조명 연산: Fragment Shader
- Rasterizer: 법선 벡터를 보간한다.
** 2025-1 중간고사 **

- 정답: O
** 2025-1 중간고사 **

- 정답: Rasterizer

'4. University Study > Multimedia' 카테고리의 다른 글
| [Multimedia] Lecture 11. Raytracing (0) | 2026.04.11 |
|---|---|
| [Multimedia] Lecture 10. Normal Mapping (0) | 2026.04.10 |
| [Multimedia] Lecture 8. Texturing (0) | 2026.04.03 |
| [Multimedia] Lecture 7. Rasterizer, Fragment Shader, Output Merger (0) | 2026.03.28 |
| [Multimedia] Lecture 5. Vertex Shader (0) | 2026.03.22 |
