모든 레이 트레이서가 가지고 있는 한 가지는 광선 클래스와 광선을 따라 어떤 색상이 보이는지 계산하는 것입니다. 광선을 함수 P(t)=A+tb로 생각해봅시다. 여기서 P는 3D 선을 따른 3D 위치입니다. A는 광선의 원점이고 b는 광선의 방향입니다. 광선 매개변수 t는 실수입니다(코드에서는 double). 다른 t를 대입하면 P(t)는 광선을 따라 점을 이동시킵니다. 음수 t 값을 추가하면 3D 선의 어디든 갈 수 있습니다. 양수 t의 경우, A 앞의 부분만 얻으며, 이것을 종종 반직선 또는 광선이라고 합니다.
그림 2: 선형 보간

광선의 개념을 클래스로 표현할 수 있으며, 함수 P(t)를 다음과 같이 호출할 함수로 표현할 수 있습니다:
ray::at(t)
#pragma once
#ifndef RAY_H
#define RAY_H
#include "Vec3.h"
class Ray
{
public:
Ray() {}
Ray(const Point3& origin, const Vector3& direction)
: mOrig(origin), mDir(direction) {}
const Point3& Origin() const { return mOrig; }
const Vector3& Direction() const { return mDir; }
Point3 At(double t) const
{
return mOrig + t * mDir;
}
private:
Point3 mOrig;
Vector3 mDir;
};
#endif
리스트 7: [ray.h] ray 클래스
(C++에 익숙하지 않은 분들을 위해 설명하자면, ray::origin() 및 ray::direction() 함수는 모두 멤버에 대한 불변 참조를 반환합니다. 호출자는 참조를 직접 사용하거나 필요에 따라 변경 가능한 복사본을 만들 수 있습니다.)
이제 본격적으로 레이 트레이서를 만들 준비가 되었습니다. 레이 트레이서의 핵심은 픽셀을 통해 광선을 보내고 그 방향에서 보이는 색상을 계산하는 것입니다. 주요 단계는 다음과 같습니다:
레이 트레이서를 처음 개발할 때는 항상 간단한 카메라로 시작하여 코드를 작동시킵니다.
디버깅 시 정사각형 이미지를 사용하면 x와 y를 자주 혼동하여 문제가 생기기 때문에, 정사각형이 아닌 이미지를 사용하겠습니다. 정사각형 이미지는 너비와 높이가 같아 1:1 종횡비를 가집니다. 여기서는 매우 일반적인 16:9 종횡비를 선택하겠습니다. 16:9 종횡비는 이미지 너비 대 높이의 비율이 16:9임을 의미합니다. 다시 말해,
$$ width/height=16/9=1.7778 $$
실용적인 예로, 너비 800픽셀, 높이 400픽셀의 이미지는 2:1 종횡비를 가집니다.
이미지의 종횡비는 너비 대 높이의 비율로 결정됩니다. 하지만 특정 종횡비를 염두에 두고 있으므로, 이미지 너비와 종횡비를 먼저 설정한 다음 이를 사용하여 높이를 계산하는 것이 더 쉽습니다. 이렇게 하면 이미지 너비를 변경하여 크기를 조정할 때 원하는 종횡비를 유지할 수 있습니다. 이미지 높이를 계산할 때는 결과가 최소 1이 되도록 해야 합니다.