Company
교육 철학
🎯

14. Where Next? (다음은 무엇인가?)

Where Next?

A Final Render

이 책의 표지에 나올 이미지를 만들어 봅시다 — 수많은 랜덤한 구체들로 구성됩니다.
int main() { HittableList world; auto groundMaterial = std::make_shared<Lambertian>(Color(0.5, 0.5, 0.5)); world.Add(std::make_shared<Sphere>(Point3(0.0, -1000.0, 0.0), 1000.0, groundMaterial)); for (int gridX = -11; gridX < 11; gridX++) { for (int gridZ = -11; gridZ < 11; gridZ++) { const double materialSelector = RandomDouble(); const Point3 center( gridX + 0.9 * RandomDouble(), 0.2, gridZ + 0.9 * RandomDouble() ); if ((center - Point3(4.0, 0.2, 0.0)).Length() > 0.9) { std::shared_ptr<Material> sphereMaterial; if (materialSelector < 0.8) { const Color albedo = Color::Random() * Color::Random(); sphereMaterial = std::make_shared<Lambertian>(albedo); } else if (materialSelector < 0.95) { const Color albedo = Color::Random(0.5, 1.0); const double fuzz = RandomDouble(0.0, 0.5); sphereMaterial = std::make_shared<Metal>(albedo, fuzz); } else { sphereMaterial = std::make_shared<Dielectric>(1.5); } world.Add(std::make_shared<Sphere>(center, 0.2, sphereMaterial)); } } } auto material1 = std::make_shared<Dielectric>(1.5); world.Add(std::make_shared<Sphere>(Point3(0.0, 1.0, 0.0), 1.0, material1)); auto material2 = std::make_shared<Lambertian>(Color(0.4, 0.2, 0.1)); world.Add(std::make_shared<Sphere>(Point3(-4.0, 1.0, 0.0), 1.0, material2)); auto material3 = std::make_shared<Metal>(Color(0.7, 0.6, 0.5), 0.0); world.Add(std::make_shared<Sphere>(Point3(4.0, 1.0, 0.0), 1.0, material3)); Camera camera; camera.aspectRatio = 16.0 / 9.0; camera.imageWidth = 1200; camera.samplesPerPixel = 500; camera.maxDepth = 50; camera.vfov = 20.0; camera.lookfrom = Point3(13.0, 2.0, 3.0); camera.lookat = Point3(0.0, 0.0, 0.0); camera.vup = Vec3(0.0, 1.0, 0.0); camera.defocusAngle = 0.6; camera.focusDistance = 10.0; camera.Render(world); return 0; }
C++
복사
*Listing 88: [main.cc] 최종 장면*
(참고: 위의 코드는 프로젝트 샘플 코드와 약간 다릅니다: samplesPerPixel은 위에서 500으로 설정되어 있어 고품질 이미지를 생성하지만

Next Steps

Y이제 멋진 레이 트레이서를 갖게 되었습니다! 이제 무엇을 할까요?

Book 2: Ray Tracing: The Next Week

이 시리즈의 두 번째 책은 여기서 개발한 레이 트레이서를 기반으로 합니다. 여기에는 다음과 같은 새로운 기능이 포함됩니다:
모션 블러 — 움직이는 물체를 사실적으로 렌더링합니다.
경계 볼륨 계층 구조 — 복잡한 장면의 렌더링 속도를 높입니다.
텍스처 맵 — 객체에 이미지를 배치합니다.
펄린 노이즈 — 많은 기술에 매우 유용한 랜덤 노이즈 생성기입니다.
사각형 — 구체 외에 렌더링할 수 있는 것입니다! 또한 디스크, 삼각형, 링 또는 거의 모든 2D 기본 도형을 구현하는 기초가 됩니다.
조명 — 장면에 광원을 추가합니다.
변환 — 객체를 배치하고 회전하는 데 유용합니다.
볼륨 렌더링 — 연기, 구름 및 기타 기체 볼륨을 렌더링합니다.

Book 3: Ray Tracing: The Rest of Your Life

이 책은 두 번째 책의 내용을 다시 확장합니다. 이 책의 많은 부분은 렌더링된 이미지 품질과 렌더러 성능을 모두 개선하는 것에 관한 것이며, 올바른 광선을 생성하고 적절하게 축적하는 데 중점을 둡니다.
이 책은 전문가 수준의 레이 트레이서 작성에 진지하게 관심이 있거나, 서브서피스 스캐터링이나 중첩된 유전체와 같은 고급 효과를 구현하기 위한 기초에 관심이 있는 독자를 위한 것입니다.

Other Directions

여기에서 취할 수 있는 추가 방향이 너무 많으며, 이 시리즈에서 (아직?) 다루지 않은 기술도 포함됩니다. 여기에는 다음이 포함됩니다:
Triangles — 대부분의 멋진 모델은 삼각형 형태입니다. 모델 I/O는 최악이며 거의 모든 사람이 다른 사람의 코드를 사용하려고 합니다. 여기에는 자체적인 문제를 제시하는 대규모 삼각형 메시를 효율적으로 처리하는 것도 포함됩니다.
Parallelism — N개의 코어에서 서로 다른 랜덤 시드를 사용하여 코드의 N개 복사본을 실행합니다. N번의 실행을 평균화합니다. 이 평균화는 N/2 쌍을 평균화하여 N/4 이미지를 얻고, 이들 쌍을 평균화하는 방식으로 계층적으로 수행될 수도 있습니다. 이러한 병렬 처리 방법은 매우 적은 코딩으로 수천 개의 코어까지 잘 확장되어야 합니다.
Shadow Rays — 광원을 향해 광선을 발사할 때, 특정 지점이 어떻게 그림자가 되는지 정확히 결정할 수 있습니다. 이를 통해 선명하거나 부드러운 그림자를 렌더링하여 장면에 또 다른 수준의 사실감을 추가할 수 있습니다.
재미있게 하세요, 그리고 멋진 이미지를 보내주세요!