이전 글에서 원기둥과 광선의 접점 그리고 원기둥의 법선 벡터를 구하는 방법을 알아봤다. 이번 글에서는, 접점과 법선 벡터를 사용하여 난반사 표면을 렌더링하는 방법을 배워보자.
정반사 표면에서 표면에 들어오는 광선과 법선 벡터는 입사각을 이루고, 반사되어 나가는 광선과 법선 벡터는 반사각을 이룬다. 난반사 표면에서는 이와는 다르게 모든 방향으로 반사된다. 조금 더 정확히는, 특정 반구 내의 모든 방향으로 반사된다. 광선과 난반사 표면의 접점 P와, 해당 점 P에서의 접평면 Pl이 있을 때, 무한한 접평면 Pl은 공간을 이등분한다. 이렇게 이등분된 공간에서 광선의 시발점이 존재하는 부분공간 가 있을 것이다. 점 P에서 부분 공간 내의 모든 방향으로 반사되는 것이다.
난반사 표면을 렌더링하기에 앞서 눈의 동작 원리와 빛을 간단히 다뤄보자.
눈에는 밝은 빛에 잘 반응하는 cone cell과 어두운 빛에 잘 반응하는 rod cell이 존재한다. rod cell이 색 감각에 미치는 영향은 거의 없고 cone cell이 색 감각에 지대한 영향을 미친다. 이것이 무척 어두운 환경에서 세상이 흑백에 가깝게 보이는 이유다. Cone cell은 다시 세 종류로(L, M, N) 나뉘는데, 각 종류의 cone cell은 특정 파장의 빛에 민감하게 반응한다. L cone cell은 빨간빛 특히 560nm 파장의 빛에 제일 민감하다. M cone cell은 녹색과 노란빛 특히 530nm 파장의 빛에 민감하며 N cone cell은 파란 빛 특히 450nm 파장의 빛에 민감하다. 이처럼 빛은 빨녹파의 빛에 반응하는 세 종류의 cone cell을 통해 우리의 뇌에 입력되어 처리된다. 이것이 우리가 세상을 보는 방법이다.
카메라를 시뮬레이트할 때에도 얘기했듯이 세상을 시뮬레이트할 때 꼭 최대한 현실적으로 시뮬레이트하는 것이 최선은 아니다. 중요한 부분과 중요하지 않은 부분을 나누어서 정말 필요한 부분의 기능을 구현하는 것이 바람직하다. 사용자가 눈을 통해 렌더링 된 결과물을 받아들이고 지각하기 때문에, 눈으로 봤을 때 큰 차이가 없다면, 렌더링을 구현해야하는 입장에서 중요한 내용이 아닌 것이다. 그렇기에 우리는 빛을 고려할 때 연속적인 파장의 빛을 고려하지 않고 눈의 동작 원리를 고려하여 이산적인 세 종류의 빛만(Red, Green, Blue) 다룰 것이다.
픽셀의 색을 결정하는 것은 단위 시간 동안 해당 픽셀을 지나는 빛의 양을 결정하는 것과 같다. 빨간빛이 많이 들어오면 픽셀의 R값이 커질 것이고 녹색빛이 많이 들어오면 픽셀의 G값이 커진다. 그렇기에 우리는 빛의 양을 다룰 필요가 있다. 만약 radiometry에 대해 알지 못한다면 이 시리즈의 radiometry 글을 참고하자.
광원의 radiance가 이라고 해보자. radiance는 거리에 따라서 변하지 않는 광원의 성질이다. 당연히 단위 면적에 도달하는 빛의 양은 광원에게서 멀어짐에 따라 감소하는 것이 맞다. 광원과 단위 면적이 진공 속에 존재하더라도 면적에 도달하는 빛의 양은 거리와 반비례한다. 하지만 거리가 멀어짐에 따라 단위 solid angle이 커버하는 면적이 커지기 때문에 radiance는 변하지 않는다.
그렇다면 광원에서 표면의 미소 면적으로 들어오는 빛은 radiance를 거리 으로 나눈 것일 테니 광원의 radiance와 미소 면적에 들어오는 빛의 파워는 거리를 고려하지 않는다면 동일하다고 볼 수 있다. 그렇다면 반사되는 빛의 양은 아래와 같을 것이다.
위의 식에서 는 난반사 표면의 반사율이고 는 구면 좌표계에서의 적분 결과를 직교 좌표계에서의 적분 결과로 바꾸기 위해 곱하는 값이다. 왜 가 들어가는지 이해되지 않는다면, 이 시리즈의 배경지식 파트를 읽고오자.
여기에서 단위 시간 동안 반사되는 빛의 양이 들어오는 빛의 양보다 작아야한다는 규칙을 지키기 위해 아래의 식을 충족하도록 만들면 된다.
이 식을 충족하기 위해서는 가 돼야한다.
거리를 고려하지 않는다면 을 그대로 픽셀의 색으로 사용하면 되고 거리를 고려한다면 거리의 제곱으로 나누어서 픽셀의 색으로 사용하면 된다.