출처:
Ray Tracing in One Weekend - Shading with Surface Normals
Github - GaepoMorningEagles/mini_raytracing_in_c
먼저 음영처리를 할 수 있도록 표면 법선을 만들어 보겠다. 이 법선은 광선과 구의 교차점에서 표면에 수직인 벡터이다. 법선에 대해 두 가지 설계를 할 수 있다. 첫 번째는 법선을 단위벡터로 설정할 것인지를 결정해야 한다. 음영 처리에 편리하지만 미묘한 버그가 생길 수 있는데, 개인적 선호도에 따르면 된다. 우리 코드에서는 단위벡터로 사용한다. 구에서 바깥 쪽 법선은 교점에서 중점을 뺀 방향이다.
아직 조명 같은 게 없으므로 컬러맵으로 법선을 시각화하겠다. 법선벡터는 hit 여부뿐만 아니라 hit point 가 필요하다. 현재 우리 코드에서는 장면에 구가 하나만 있고 카메라 바로 앞에 있으므로 의 음수 값은 신경쓰지 않아도 된다. 우리는 가장 가까운 hit point (가장 작은 )를 가정한다.
코드에서 판별식이 0보다 작으면 어떤 음수(-1.0)를 리턴하고, 그렇지 않을 때에는 hit point 에서의 근을 리턴한다. 그리고 ray_color()
에서 리턴값을 t
가 받는다. 그 t
가 0보다 크면 구와 만난 것이므로 법선벡터 n
을 구하고 이를 기준으로 색상값이 변하게 했다. 법선벡터 n
은 단위벡터이므로 범위가 인데, 색상값은 의 범위로 전달해야 하기 때문에 각 값에 1을 더해주고 0.5를 곱해서 범위를 맞춰주었다.