저는 수년 동안 많은 그래픽스 강의를 해왔습니다. 모든 코드를 작성해야 하지만 API 없이 멋진 이미지를 얻을 수 있기 때문에 제 강의에서는 종종 레이 트레이싱을 다룹니다. 가능한 한 빨리 멋진 프로그램을 만들 수 있도록 이 책에서 저의 강의 노트를 정리할 생각입니다.
일단 이미지를 보는 방법이 필요합니다. 가장 간단한 방법은 파일에 결과를 출력하는 것입니다. 하지만 문제는 파일 포맷의 종류가 너무 많다는 것입니다. 파일 포맷들 중 다수의 포맷들은 복잡합니다. 저는 항상 plain text ppm file로 시작합니다.
거의 모든 그래픽스 프로그램은 기하학적 벡터와 색상을 저장하는 클래스를 가지고 있습니다. 많은 시스템에서 이 벡터들은 4차원(xyz + 동차좌표 또는 RGB + 투명도)입니다. 우리가 만들려고 하는 것은 3차원 좌표계로 충분합니다. `vec3` 클래스를 사용하여 색상,
모든 레이 트레이서는 광선(ray)을 따라서 어떤 색이 보이는지 계산하는 ray 클래스를 가지고 있습니다. 광선을 함수 P(t) = A + tb라고 생각해봅시다. P는 3D 공간에서 한 직선상의 위치입니다. A는 광선의 원점이고 b는 광선의 방향입니다. 파리미터 t는
레이 트레이서에 오브젝트 한 개를 추가해봅시다. 구(sphere)는 광선이 오브젝트를 교차하는지 계산이 매우 간단하기 때문에 레이 트레이서에서 구가 자주 사용됩니다.
첫 번째로, 음영 표현을 위해 표면 법선 벡터를 계산합니다. 이것은 교차점의 표면에 대하여 수직인 벡터입니다. 법선 벡터를 만들기 위한 두 가지 설계 결정사항이 있습니다. 한 가지는 법선 벡터의 크기가 단위 길이인지 여부입니다. 법선 벡터의 크기가 단위 길이라면 음영을
실제 카메라로 사진을 찍으면 가장자리에서 계단현상(jaggies)이 대개 발생하지 않습니다. 가장자리 픽셀에서 앞쪽과 뒤쪽의 색상이 혼합되기 때문입니다. 각 픽셀 내부의 샘플들의 평균을 활용하여 같은 효과를 구현할 수 있습니다. 계층화(stratification)는 신
이제, 물체와 여러 개의 픽셀 당 광선을 만들었으므로, 사실적인 메테리얼을 만들 수 있습니다. 디퓨즈(diffuse(matte)) 메테리얼부터 시작하겠습니다. 한 가지 질문은 지오메트리와 메테리얼을 다양하게 조합할 것(메테리얼을 여러 구에 할당할 수 있습니다. 그 반대
만약 다른 메테리얼을 가진 또다른 오브젝트를 원한다면, 설계 결정사항을 가지고 있습니다. 많은 매개 변수와 다른 메테리얼 타입을 가진 범용적인 메테리얼을 만들 수 있습니다. 이건 나쁜 접근 방식이 아닙니다. 또는 동작을 캡슐화하는 추상 메테리얼 클래스를 만들 수 있습니
유전체와 마찬가지로 카메라는 디버깅하기가 어렵습니다. 그래서 저는 항상 점진적으로 코드를 작성합니다. 첫 번째, 조절할 수 있는 시야(field of view : fov)를 적용합니다. fov는 문을 통해 보는 각도입니다. 우리가 다루는 이미지는 정사각형이 아니기 때문