[miniRT] 핵심개념 - 레이케스팅, 레이트레이싱

sham·2022년 5월 20일
0

[miniRT]

목록 보기
13/19

개요

가상 카메라로 카메라가 가리키는 방향을 지정한 후, 이미지를 형성하는 이미지 평면을 띄우고 2차원 상에서 해당 물체를 픽셀 형태로 렌더링한다.

캔버스 역할을 하는 이미지 평면을 색칠하는 것과 비슷하다.

실제 이미지는 이백만 이상의 픽셀로 이루어져 있다.

과제에서 사용할 알고리즘인 레이트레이싱은 렌더링 관련 다양한 알고리즘의 일종이다.

레이트레이싱은 말그대로 Ray(빛) + Tracing(추적하다), 즉 빛을 이용해서 렌더링을 하는 기법이다.

레이케스팅, 레이트레이싱?

처음 두 개념을 접했을 때는 레이케스팅은 2D를 3D처럼 렌더링 하는 기법, 레이트레이싱은 3D를 렌더링하는 기법이라고 이해하고 있었으나, 실제 개념은 나의 이해와는 달랐다.

Ray(빛) + Casting(쏘다)

말 그대로 빛을 쏘아서 부딪힌 물체의 표면을 감지하는 기술이다. 빛에서부터 물체까지의 거리를 바탕으로 얼마나 가까이 렌더링해야하는지를 결정한다.

화면의 X축으로 모든 픽셀마다 카메라가 바라보고 있는 방향으로 광선을 투사한 후 벽까지의 거리를 구하는데, 벽 까지의 거리가 멀면 가로 1픽셀 짜리 짧은 세로줄을 해당 X위치에 그리고 벽 까지의 거리가 가까우면 가로 1픽셀 짜리 긴 세로줄을 해당 X위치에 그리는 방식으로 3D같은 입체감을 줄 수 있다.

cud3D는 2D맵을 기반으로 하기 때문에 레이케스팅으로도 구현이 가능하다.

Ray(빛) + Tracing(추적하다)

레이트레이싱은 레이케스팅처럼 빛을 쏘되, 빛이 해당 물체의 표면에 닿은 후 현실처럼 빛이 다시 재귀적으로 반사되어 결과물을 렌더링 하는 방식이다.

레이트레이싱도 레이케스팅처럼 빛을 쏘되, X축인 수평선으로만 쏘는 것이 아닌 화면의 모든 픽셀마다 빛을 쏘아서 충돌에 따라 해당 픽셀을 색칠하는 방식이다. 화면의 모든 픽셀마다 빛을 쏜다고 하였지만 엄밀히 말하면 모눈종이처럼 되어 있는 캔버스에 빛을 쏘는 것인데, 캔버스의 각 픽셀이 모니터의 픽셀을 구성하게 된다.

miniRT는 3D 상에 존재하는 물체를 렌더링하는 과제이기에 레이트레이싱으로 구현해야 한다.

레이캐스팅은 해당 물체에 닿으면 일회성으로 사용되고 더 이상 연산을 수행하지 않는 반면, 레이트레이싱은 계속해서 빛을 반사시켜서 어디에 부딪히는 지를 추적한다는 차이점이 있다.

빛 추적으로 색깔 판별

픽셀의 색깔을 결정하기 위해 광선 추적기는 카메라에서 출발해 해당 픽셀의 중앙을 관통해서 나아가는데, 이 때 부딪히는 물체와 색깔, 물체와의 거리를 기반으로 해서 해당 픽셀의 색깔이 결정된다.

이미지상의 모든 픽셀은 이 과정을 거쳐서 렌더링된다.

빛 반사

표면 상의 한 점에서 시작하여 카메라로 돌아가는 빛의 양을 결정하는 요인은 다음과 같다.

  1. 그 점으로 빛이 얼마나 떨어지는지(강한지)
    1. 광원이 가까울 수록 빛은 많이 떨어진다.
    2. 표면이 빛의 방향과 수직이라면 더 강할 것이다.
  2. 표면 상의 물체가 빛을 어떻게 분산하고 반사하는지
    1. 질감에 따라 같은 빛을 받더라도 다르게 빛을 반사한다. 흐릿한 표면은 분산되고 빛나는 표면은 반사된다.
  3. 카메라는 어디 있는지
    1. 보는 위치가 변화함에 따라 캔버스도 변한다.

빛 굴절

물체로부터 광원으로 향하는 광선을 그림자 광선이라고 부른다.

광원으로부터 나온 물체로 향하는 광선을 직접 조명이라고 부른다.

다른 물체로부터 반사되서 부딪히는 빛을 간접 조명이라고 부른다.


레퍼런스

1. What is ray tracing? (video) | Rendering | Khan Academy

profile
씨앗 개발자

0개의 댓글