라떼군 이야기


7 / 10강

빛과 표면으로 색 계산하기

같은 물체라도 빛을 정면으로 받을 때와 비스듬히 받을 때는 밝기가 다릅니다. 조명 계산에는 표면의 방향과 빛의 방향, 재질이 함께 들어갑니다.

확산 반사의 간단한 모델

무광 표면을 설명하는 램버트 모델에서는 단위 법선 N과 표면에서 광원으로 향하는 단위 방향 L의 내적을 씁니다. 비율은 max(0, N·L)입니다. 뒤쪽에서 오는 빛 때문에 밝기가 음수가 되지 않도록 0에서 자릅니다.

normal = (0, 0, 1)
light = (0, 0.8, 0.6)
dot = sum(n * l for n, l in zip(normal, light))
diffuse = 0.8 * max(0, dot)
print(round(diffuse, 2))

출력은 0.48입니다. 내적은 0.6이고, 여기에 재질의 반사 비율 0.8을 곱했습니다. 이는 광량을 1로 둔 단순한 선형 밝기 계산이며 실제 화면에 저장할 sRGB 값과 바로 같지는 않습니다.

반짝이는 부분은 관찰 방향도 봅니다

정반사는 시선과 반사 방향에 따라 달라지는 하이라이트를 만듭니다. 고전적인 Phong 조명 모델은 주변광, 확산광, 정반사 항을 더해 근사합니다. 주변광을 상수로 더하는 것은 여러 번 반사되는 실제 빛을 완전히 계산한 결과가 아닙니다.

빛이 다른 물체에 가려지는 그림자를 표현하려면 별도의 가시성 계산도 필요합니다. 법선과 내적만으로 그림자가 저절로 생기지는 않습니다.

확인 문제

표면의 단위 법선이 (0,0,1), 빛 방향이 (1,0,0)이면 확산 반사 항은 얼마인가요?

해설 보기

내적이 0이므로 이 광원의 확산 항도 0입니다. 빛이 표면을 스치듯 지나가는 방향입니다. 다른 광원이나 간접광이 있다면 최종 화면 전체가 반드시 검은색이라는 뜻은 아닙니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.