레이 트레이싱 (1)

레이 트레이싱의 원리

2020년 11월 25일

레이 트레이싱

물체의 색은 반사된 빛이 우리 눈에 비친 결과물입니다. 반사된 빛은 곧바로 우리 눈에 들어오기도 하고 다른 물체에 굴절되거나 다시 반사된 뒤 들어오기도 합니다. 이런 빛의 속성을 이용해, 보다 실제와 가깝게 그려내는 컴퓨터 그래픽스 기법이 레이 트레이싱입니다.


레이 트레이싱은 카메라에 상이 맺히기까지의 빛의 경로를 추적합니다. 카메라로 전구가 켜져 있는 방안을 찍을 때, 전구로부터 나오는 무수히 많은 광선들 중 일부만이 카메라 상에 맺힙니다. 무수히 많은 광선들을 추적하는 것은 불가능하므로 레이 트레이싱에서는 카메라 상에 맺힌 일부 광선만을 추적합니다.

카메라에 상이 맺히기 까지의 과정을 시간순으로 정리하면 아래와 같습니다.

  1. 광원으로부터 빛 입자의 분출
  2. 물체에 부딪힌 빛의 확산
  3. 확산된 빛 입자가 카메라 렌즈를 거쳐 상에 맺힘

빛을 추적한다는 것은 빛이 지나온 길을 되돌아 간다는 뜻입니다. 위의 과정을 거꾸로 따라가 보면 다음과 같습니다.

  1. 카메라 상에 맺힌 빛 입자가 카메라 렌즈를 거쳐 카메라 바디 밖으로 역행
  2. 물체에 부딪힌 빛이 확산되기 이전의 상태로 돌아감
  3. 빛이 광원으로 돌아감

빛의 추적을 어떻게 따라가야 할지 대략적인 큰 그림을 보았습니다. 과정을 조금 더 세분화 해보겠습니다.

  1. 카메라 원점으로부터 이미지 상 픽셀을 향하는 광선이 있다고 가정
  2. 공간상의 모든 물체에 대해 광선이 가장 가까이에서 부딪힌 물체를 판정. 만약 부딪힌 물체가 없다면 이후 과정을 생략
  3. 부딪힌 지점에 대해 물체의 색을 계산
  4. 부딪힌 지점에서 빛의 반사를 추적해 색을 계산
  5. 부딪힌 지점에서 빛의 굴절을 추적해 색을 계산

빛의 추적을 의사 코드까지 확장해 보겠습니다. 위 그림의 첫번째 과정처럼 광선 역추적은 이미지의 각각의 픽셀에 대해 시행됩니다. 픽셀마다 광선 객체 ray 를 생성하고 함수 ray_traceray 와 물체, 광원을 이용해 색을 구합니다.

def render_ray_tracing_image():
	for y in range(0, height):
		for x in range(0, width):
			ray = # x, y 를 이용한 광선 객체
			grid[y][x] = ray_trace(ray)

def ray_trace(ray):
	obj = # 부딪힌 물체들 중 가장 가까운 물체
	if obj is None:
		return background_color
	color = # 부딪힌 물체의 색
	reflect_ray = # 부딪힌 지점에서 반사된 광선
	refract_ray = # 부딪힌 지점에서 굴절된 광선
	color += ray_trace(reflect_ray)
	color += ray_trace(refract_ray)
	return color

앞으로 이어지는 글들은 크게 물체와 광선의 부딪힘 판단, phong reflection 쉐이딩, 그림자, 반사와 굴절, 텍스쳐 매핑을 이해하고 해결하는데 집중합니다. 그래픽스 영역은 기본적으로 기하학과 선형대수학을 필요로 합니다. 하지만 앞으로 살펴볼 내용들은 레이 트레이싱의 기본 원리에 집중하므로 고등학교 수준의 기하와 벡터만 알고 있다면 무리없이 이해하실 수 있습니다.