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++
복사
(참고: 위의 코드는 프로젝트 샘플 코드와 약간 다릅니다: 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 — 광원을 향해 광선을 발사할 때, 특정 지점이 어떻게 그림자가 되는지 정확히 결정할 수 있습니다. 이를 통해 선명하거나 부드러운 그림자를 렌더링하여 장면에 또 다른 수준의 사실감을 추가할 수 있습니다.
재미있게 하세요, 그리고 멋진 이미지를 보내주세요!



