Quick Reference
| 항목 | 의미 |
|---|---|
| Ambient | 간접광을 단순 근사한 기본 밝기 |
| Diffuse | 표면 normal과 빛 방향의 관계 |
| Specular | 시선 방향으로 반사되는 하이라이트 |
| Lambert | max(dot(N, L), 0) diffuse |
| Blinn-Phong | half vector 기반 specular 근사 |
direct contribution = radiance * visibility * BRDF(N, V, L) * max(dot(N, L), 0)
N, V, L은 같은 좌표 공간의 정규화된 방향이어야 한다.구조
조명 모델은 빛, 표면, 카메라의 관계를 계산해 색을 만듭니다. 가장 기본적인 diffuse 조명은 표면 normal과 빛 방향의 dot product를 사용합니다.
diffuse = max(dot(normal, lightDir), 0)normal이 빛을 향하면 밝고, 옆을 향하면 어두우며, 반대 방향이면 0이 됩니다. specular는 view direction과 reflection 또는 half vector를 사용해 하이라이트를 만듭니다.
point light와 spot light는 거리 감쇠를 함께 봐야 합니다. 방향만 맞아도 빛에서 멀어질수록 약해지고, spot light는 cone 안팎의 각도까지 밝기에 영향을 줍니다.
point light의 물리 기반 감쇠는 거리 제곱에 가까운 형태지만, 실시간 renderer는 range cutoff와 exposure에 맞춘 보정 함수를 함께 씁니다. spot light는 inner/outer cone 각도 사이에서 부드럽게 감쇠하는지를 정하지 않으면 경계가 딱 끊겨 보입니다. range, intensity 단위, attenuation curve를 엔진마다 같은 의미로 가정하면 안 됩니다.
ambient는 실제 간접광 계산이 아니라 “어두운 곳이 완전히 검게 죽지 않게 하는” 단순 근사입니다. 그래서 ambient, diffuse, specular를 더하는 기본 모델은 학습용으로 좋지만, 실제 재질 일관성은 PBR과 IBL에서 더 중요해집니다.
공간 일치
normal, light direction, view direction은 같은 좌표 공간에 있어야 합니다. 하나는 world space이고 다른 하나는 view space이면 dot product가 의미를 잃습니다.
선택 기준
| 목표 | 모델 |
|---|---|
| 기본 조명 개념 학습 | Lambert + Blinn-Phong |
| 물리 기반 재질 | PBR, microfacet BRDF |
| 스타일화된 표면 | toon, ramp shading |
| 실시간 다중 조명 | 비용과 light culling 고려 |
| 간접광 표현 | ambient, IBL, GI |
기본 조명 모델은 이해하기 쉽지만 에너지 보존, 재질 일관성, 환경광 반사 표현에는 한계가 있습니다. 현대 실시간 렌더링은 대개 PBR 모델을 사용합니다.
visibility는 shadow map, ray query, screen-space occlusion처럼 별도 기법에서 가져옵니다. N·L이 0보다 크다고 해서 빛이 실제로 보인다는 뜻은 아니며, shadow term과 ambient/GI를 Lambert 식 안에 섞으면 디버깅하기 어려워집니다.
주의할 점
ambient 값을 단순히 크게 올리면 그림자가 사라지고 재질이 납작해 보일 수 있습니다. 어두운 영역을 밝히려면 간접광, ambient occlusion, image-based lighting 같은 축을 함께 봐야 합니다.
또 specular 색과 강도를 임의로 조절하면 금속/비금속 재질의 일관성이 깨질 수 있습니다.
light direction의 부호도 API 문제가 아니라 변수 정의 문제입니다. surface -> light 방향을 L로 쓸지 light -> surface 방향을 쓸지 먼저 정하고, dot product와 shadow ray가 같은 정의를 쓰게 합니다. 부호를 한 shader만 반대로 쓰면 한쪽 조명이 전부 검게 됩니다.
참고 링크
1 sources