| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- DDPM
- 모수 추정 방법
- CNN
- 최대 사후 확률
- depthwise convolution
- posec3d
- computer graphics
- Focal loss
- 최대 가능도 추정
- 티스토리챌린지
- 오블완
- Image denoising
- Swin Transformer
- C++
- deformable covolution
- OpenGL
- Unreal Engine
- covolution
- 딥러닝
- convolution
- Action Recognition
- Diffusion
- 포인터
- Deep Learning
- mobilenet
- Vision Transformer
- Today
- Total
심드렁하게 저장
2. OpenGL 조명 : 3D 그래픽에서의 빛 본문
3D 그래픽에서 조명은 매우 중요한 요소이다. 현실감 넘치는 장면을 구현하려면, 물체가 어떻게 빛을 반사하고, 그림자를 만들며, 표면의 질감과 색을 어떻게 나타내는지에 대한 이해가 필요하다. OpenGL에서는 이러한 조명 효과를 처리하기 위해 여러 가지 기법을 제공한다. 이 포스팅에서는 OpenGL에서 조명이 어떻게 작동하는지, 주요 조명 모델과 구현 방법을 기록하려고 한다.
1. 조명의 기본 개념
조명은 3D 그래픽에서 광원(Light Source) 과 광선(Ray) 의 상호작용을 의미한다. 이 상호작용은 물체의 표면과 빛이 만나면서 반사, 굴절, 산란 등의 현상을 일으키며, 그에 따라 시각적 효과가 달라진다. OpenGL에서는 조명 모델을 사용해 물체에 적용되는 조명 효과를 계산한다.
조명 효과를 만들기 위해서는 다음과 같은 요소들이 필요하다:
- 광원: 빛을 발산하는 위치와 성질
- 재질(Material): 빛이 물체의 표면과 상호작용하는 방식
- 조명 모델: 빛이 어떻게 물체에 영향을 미치는지 설명하는 수학적 모델
2. OpenGL 조명 모델
OpenGL에서 사용되는 조명 모델은 주로 Phong 모델을 기반으로 한다. Phong 모델은 빛의 반사와 분포를 계산하는 방식으로, 현실감 있는 조명 효과를 제공한다. 이 모델은 크게 세 가지 주요 반사 성분으로 나뉜다:
1. Ambient Light

- 모든 방향에서 일정하게 퍼지는 빛으로, 물체의 표면에서 반사되거나 굴절되지 않으며, 주변 환경에서 부드럽게 확산된 빛
- 이 빛은 물체의 표면을 어느 각도로 보더라도 일정한 밝기를 유지하게 만듦
- 기본적인 조명 효과를 제공하지만, 그림자나 표면의 세부 디테일을 표현하지 않음
// ambient
float ambientStrength = 0.1f;
vec3 ambient = ambientStrength * lightColor;
2. Diffuse Light
Diffuse Light는 빛이 물체 표면에 수직으로 닿을 때 가장 강하게 반사되는 빛이다. 빛이 물체 표면과 일정한 각도로 닿을수록 확산광의 강도가 달라지며, 물체 표면의 법선 벡터와 빛의 방향 벡터 사이의 각도에 의존한다. 이로 인해 물체 표면의 디테일과 질감이 더 뚜렷하게 드러난다.

Diffuse Light의 세기는 물체 표면의 법선 벡터 과 빛의 방향 벡터 사이의 내적에 비례한다. 내적 값은 두 벡터 사이의 각도를 반영하므로, 이 값을 통해 표면에 닿는 빛의 양을 계산할 수 있다.
// diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
3. Specular Light
Specular Light는 빛이 표면에서 반사되어 관찰자에게 도달하는 빛이다. 반사광은 물체 표면이 얼마나 매끄럽고 광택이 있는지에 따라 달라진다. Specular Light는 주로 하이라이트(빛의 반사점) 형태로 나타나며, 물체 표면의 광택도와 관련이 있다. Specular Light의 강도는 물체 표면의 관찰자 방향에 따라 달라지므로, 표면의 반사 성질을 잘 표현할 수 있다.

반사광의 세기는 반사 벡터 관찰자 방향 벡터 사이의 내적에 비례하며, 이 값은 광택도 K와 함께 계산된다
// specular
float specularStrength = 0.5;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor;
4. Phong Model 결합
최종적으로, Phong 모델에서의 최종 조명 값은 세 가지 성분(환경광, 확산광, 반사광)을 합산하여 계산한다.
vec3 result = (ambient + diffuse + specular) * objectColor;
FragColor = vec4(result, 1.0);

'Game, Graphics > OpenGL' 카테고리의 다른 글
| 1. 좌표 시스템의 이해 : 3D 객체가 화면에 그려지기까지 (1) | 2024.11.11 |
|---|