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


