광선(Ray)라는 아주 중요한 개념이 있다. 이 개념이 사실상 miniRT의 전부라고 해도 과언이 아닐 정도다.
3D 그래픽에서 3차원 상에 존재하는 물체들을 2차원인 모니터 위의 이미지로 변환할 때 image plane(viewport)를 이용하게 된다. image plane은 가상의 2차원 직사각형으로 모니터에서 확인하는 이미지에 대응하는 개념이다. image plane을 2차원 배열로 표현했을 때, 요소 하나하나가 이미지를 이루는 픽셀이라고 간주할 수 있게 된다.
카메라가 3차원 상에서 원점(0, 0, 0)에 존재하고, image plane은 그 앞(0, 0, 1)에 위치한다고 하였을 때, 카메라에서 픽셀(배열의 요소)을 향해 광선을 쏘았을 때 물체와 부딪히게 된다면 해당 픽셀을 물체의 색깔로 칠해주고 부딪히지 않는다면 배경의 색으로 채우는 것으로 3차원 상의 이미지를 2차원으로 변환할 수 있게 된다.
이렇게 광선을 발사하여 물체의 충돌 유무에 따라 해당 지점의 물체를 감지하는 방식을 레이케스팅이라고 한다.
빛 추적 방식 중 광원에서부터 광선을 쏘는 빛 추적 방식으로, 실제 세계의 빛의 흐름을 더 정확하게 모델링하는 방식이다.
광원에서 뿜어져 나오는 빛이 카메라로 들어가면 빛의 색깔, 물체에 충돌하여 카메라로 들어가면 물체의 색깔을 반사한다. 빛이 닿지 않는 부분은 그림자가 된다.
현실적인 빛 추적(레이 트레이싱)방식이며 물리적으로 사실적이라는 장점이 있지만, 빛의 광선이 너무 많기에 전부 추적하는 것은 불가능하다는 단점이 존재한다.
miniRT에서 이 기법을 사용하기에는 너무 무거운 기법이다.
카메라로부터 광선을 쏘는 빛 추적 방식으로, miniRT에서 사용하기로 한 방식이기도 하다.
카메라(모니터)에 들어오는 광선은 극히 일부기에 픽셀 하나하나로부터 광선을 쏘아서 해당 픽셀의 색깔을 결정하는 방식으로, 더 효율적이고 적은 자원으로도 현실처럼 구현할 수는 있지만 현실적이지는 않다는 단점이 있다.
위의 사진에서의 Screen을 image plane으로도 볼 수 있는데, 빛을 추적하지 않는, 우리가 사용할 레이 케스팅과 일치하는 개념이라고 볼 수 있을 것 같다.
원점 r에서 방향벡터 d와 길이 t를 곱한 값이 최종 목적지 r이 된다.
광선의 충돌을 감지할 때 그 감지 주기를 큼직하게 나누게 되면 사이의 물체를 알지 못하게 되고 너무 자잘하게 나누게 되면 연산이 늘어다 많이 느려지게 될 것이다.
실제 코드 상에서의 충돌은 물체를 추가하고 나서 구해볼 것이다.
https://www.youtube.com/watch?v=uPRcxCwhqD4&t=164s
(5) Raytracing One Weekend 식 이해하기! 2
mini_raytracing_in_c/03.ray_and_camera.md at main · GaepoMorningEagles/mini_raytracing_in_c