저는 수년 동안 많은 그래픽 수업을 가르쳐 왔습니다. 종종 레이 트레이싱으로 수업을 진행하는데, 모든 코드를 직접 작성해야 하지만 API 없이도 멋진 이미지를 얻을 수 있기 때문입니다. 이 강의 노트를 각색하여 여러분이 가능한 한 빨리 멋진 프로그램을 만들 수 있도록 안내하겠습니다. 완전한 기능을 갖춘 레이 트레이서는 아니지만, 레이 트레이싱을 영화의 필수 요소로 만든 간접 조명은 포함하고 있습니다. 이 과정을 따르면 여러분의 레이 트레이서 아키텍처를 더 광범위한 시스템으로 확장하기에 좋을 것입니다. 누군가가 "레이 트레이싱"이라고 말할 때 여러 가지 의미를 가질 수 있습니다. 제가 설명할 것은 기술적으로 경로 추적기(path tracer)이며, 상당히 일반적인 것입니다. 코드는 간단하지만(컴퓨터가 일을 하도록 하세요!) 만들 수 있는 이미지에 매우 만족할 것입니다.
저는 제가 하는 순서대로 레이 트레이서를 작성하는 과정을 안내하겠습니다. 몇 가지 디버깅 팁도 함께 제공할 것입니다. 마지막에는 멋진 이미지를 생성하는 레이 트레이서를 갖게 될 것입니다. 주말 안에 완료할 수 있어야 합니다. 더 오래 걸리더라도 걱정하지 마세요. 저는 C++를 주요 언어로 사용하지만, 꼭 그럴 필요는 없습니다. 하지만 C++는 빠르고 이식성이 좋으며 대부분의 프로덕션 영화 및 비디오 게임 렌더러가 C++로 작성되기 때문에 사용하는 것을 추천합니다. C++의 "현대적인 기능" 대부분은 피하지만, 상속과 연산자 오버로딩은 레이 트레이서에 너무 유용해서 포기할 수 없습니다. 저는 온라인으로 코드를 제공하지 않습니다. 하지만 코드는 실제이며 vec3 클래스의 몇 가지 간단한 연산자를 제외한 모든 것을 보여줍니다. 저는 코드를 직접 입력하여 배우는 것을 매우 중요하게 생각합니다. 코드를 사용할 수 있을 때는 사용하지만, 사용할 수 없을 때만 제가 말한 것을 실천합니다. 그러니 묻지 마세요!
제가 마지막 부분을 그대로 남겨둔 이유는 제가 얼마나 180도 태도를 바꿨는지가 우스워서입니다. 여러 독자들이 미묘한 오류로 어려움을 겪었는데, 코드를 비교했을 때 도움이 되었습니다. 그러니 코드를 직접 입력하시되, 각 책의 완성된 소스 코드는 GitHub의 RayTracing 프로젝트에서 찾을 수 있습니다.
이 책들의 구현 코드에 대한 참고 사항 — 포함된 코드에 대한 우리의 철학은 다음 목표를 우선시합니다:
따라서 코드는 기본 구현을 제공하며, 독자가 즐길 수 있는 수많은 개선 사항이 남아 있습니다. 코드를 최적화하고 현대화할 수 있는 방법은 무궁무진합니다. 우리는 단순한 해결책을 우선시합니다.
우리는 벡터에 대한 약간의 친숙함(내적과 벡터 덧셈 같은)을 가정합니다. 만약 모르신다면, 조금 복습하세요. 복습이 필요하거나 처음 배우는 경우, Morgan McGuire의 온라인 Graphics Codex, Steve Marschner와 Peter Shirley의 Fundamentals of Computer Graphics, 또는 J.D. Foley와 Andy Van Dam의 Computer Graphics: Principles and Practice를 참조하세요.
이 프로젝트, GitHub의 저장소, 디렉토리 구조, 빌드 및 실행, 수정 및 기여 방법에 대한 정보는 프로젝트 README 파일을 참조하세요.
추가 프로젝트 관련 리소스는 Further Reading 위키 페이지를 참조하세요.
이 책들은 브라우저에서 직접 인쇄할 수 있도록 포맷되었습니다. 또한 각 릴리스의 "Assets" 섹션에 각 책의 PDF도 포함되어 있습니다.
우리와 소통하고 싶으시다면, 다음 이메일로 연락 주시기 바랍니다:
마지막으로, 구현에 문제가 발생하거나 일반적인 질문이 있거나 자신의 아이디어나 작업을 공유하고 싶으시다면, GitHub 프로젝트의 GitHub Discussions 포럼을 참조하세요.
이 프로젝트에 도움을 주신 모든 분들께 감사드립니다. 이 책 마지막의 감사의 말 섹션에서 그들을 찾을 수 있습니다.