Ana içeriğe geç

Bölüm 13: Final Sahnesi ve Sonrası

Tebrikler! Bir hafta sonu içinde bir render motoru yazmanın en zorlu ve en ödüllendirici virajlarını başarıyla döndünüz:

  • Kendi 3B vektör matematiğinizi yazdınız (vec3.h),
  • Sanal bir kamera kurup sahneye milyonlarca ışık ışını fırlattınız,
  • Işın-küre kesişim cebirini çözdünüz,
  • Yüzey normallerini ve çarpışma kayıtlarını soyutladınız (hittable),
  • Kenar yumuşatma (antialiasing) için piksel altı Monte Carlo örneklemesi yaptınız,
  • Dağınık (Lambertian) yüzeyler için dolaylı aydınlatmayı simüle ettiniz,
  • Cilalı ve pürüzlü metaller için ayna yansıması matematiğini kurdunuz,
  • Snell yasası ve Schlick yaklaşımı ile cam kırılmasını gerçeğe dönüştürdünüz,
  • Konumlandırılabilir kamera ve sinematik alan derinliği (defocus blur) eklediniz!

Şimdi öğrendiğimiz her şeyi bir araya getirerek kitabın o ünlü büyük final sahnesini render edelim!


Final Sahnesi Kodu (main.cc)

Aşağıdaki program, sahneye yüzlerce rastgele konumlandırılmış cam, altın, gümüş ve mat renkli küçük küreler ile ön plana üç büyük başrol küresi yerleştirir:

main.cc (Final Sahnesi)
#include "rtweekend.h"

#include "camera.h"
#include "hittable.h"
#include "hittable_list.h"
#include "material.h"
#include "sphere.h"

int main() {
    hittable_list world;

    // Zemin
    auto ground_material = make_shared<lambertian>(color(0.5, 0.5, 0.5));
    world.add(make_shared<sphere>(point3(0,-1000,0), 1000, ground_material));

    // Yüzlerce Rastgele Küçük Küre
    for (int a = -11; a < 11; a++) {
        for (int b = -11; b < 11; b++) {
            auto choose_mat = random_double();
            point3 center(a + 0.9*random_double(), 0.2, b + 0.9*random_double());

            if ((center - point3(4, 0.2, 0)).length() > 0.9) {
                shared_ptr<material> sphere_material;

                if (choose_mat < 0.8) {
                    // Mat (Diffuse / Lambertian)
                    auto albedo = color::random() * color::random();
                    sphere_material = make_shared<lambertian>(albedo);
                    world.add(make_shared<sphere>(center, 0.2, sphere_material));
                } else if (choose_mat < 0.95) {
                    // Metal
                    auto albedo = color::random(0.5, 1);
                    auto fuzz = random_double(0, 0.5);
                    sphere_material = make_shared<metal>(albedo, fuzz);
                    world.add(make_shared<sphere>(center, 0.2, sphere_material));
                } else {
                    // Cam (Cam / Dielectric)
                    sphere_material = make_shared<dielectric>(1.5);
                    world.add(make_shared<sphere>(center, 0.2, sphere_material));
                }
            }
        }
    }

    // Üç Büyük Başrol Küresi
    auto material1 = make_shared<dielectric>(1.5);
    world.add(make_shared<sphere>(point3(0, 1, 0), 1.0, material1));

    auto material2 = make_shared<lambertian>(color(0.4, 0.2, 0.1));
    world.add(make_shared<sphere>(point3(-4, 1, 0), 1.0, material2));

    auto material3 = make_shared<metal>(color(0.7, 0.6, 0.5), 0.0);
    world.add(make_shared<sphere>(point3(4, 1, 0), 1.0, material3));

    // Kamera Yapılandırması
    camera cam;
    cam.aspect_ratio      = 16.0 / 9.0;
    cam.image_width       = 1200;
    cam.samples_per_pixel = 500;
    cam.max_depth         = 50;

    cam.vfov     = 20;
    cam.lookfrom = point3(13, 2, 3);
    cam.lookat   = point3(0, 0, 0);
    cam.vup      = vec3(0, 1, 0);

    cam.defocus_angle = 0.6;
    cam.focus_dist    = 10.0;

    // Render!
    cam.render(world);
}

Final Render Sonucu: Bir Bilgisayar Grafikleri Başyapıtı!

Derleyicimizin en yüksek optimizasyon bayraklarını açarak programımızı derleyelim:

g++ -O3 -std=c++17 main.cc -o inOneWeekend
./inOneWeekend > final_image.ppm

Bilgisayarınızın işlemcisi birkaç dakika boyunca tüm çekirdekleriyle çalışacak ve sonunda karşınıza bu nefes kesici görüntü çıkacak:

Kitap 1 Final Sahnesi Renderı


Şimdi Nereye? (Next Steps)

Tebrikler! Bilgisayar grafiklerinin en saygın eserlerinden birini tamamlayıp çalışan bir fiziksel ışın izleme motoru yazdınız.

Peki bu yolculuk burada bitiyor mu? Hayır, bu yalnızca bir başlangıç!

Peter Shirley serisinin devam eden iki efsanevi kitabı daha bulunmaktadır:

1. Kitap 2: Ray Tracing: The Next Week

  • BVH (Bounding Volume Hierarchy): Sahnede binlerce, milyonlarca nesne olduğunda her ışını her nesneyle test etmek sistemi kilitler. BVH ile nesneleri uzaysal bir ağaçta saklayarak arama süresini \(O(N)\)'den \(O(\log N)\)'e düşürürüz!
  • Doku Haritalama (Texture Mapping): Kürelerin üzerine 2 boyutlu resimler kaplamak (örneğin dünya haritası earthmap.jpg).
  • Perlin Gürültüsü (Perlin Noise): Matematiksel olarak prosedürel mermer, ahşap ve doğal kaya dokuları üretmek.
  • Dörtgenler ve Düzlemler (Quads): Duvarlar, kutular ve odalar oluşturmak.
  • Hacimsel Render (Volumes / Smoke / Fog): Sis, duman, alev ve gaz bulutlarını simüle etmek.

2. Kitap 3: Ray Tracing: The Rest of Your Life

  • Monte Carlo Entegrasyonu: Olasılık yoğunluk fonksiyonları (PDF - Probability Density Functions).
  • Önem Örneklemesi (Importance Sampling): Işınları körlemesine rastgele değil, yalnızca ışık kaynaklarına doğru odaklayarak dakikalar süren gürültüyü (noise) saniyelere indirmek.
  • Ünlü Cornell Kutusu (Cornell Box): Işık sızıntıları, renk kanaması (color bleeding) ve katı fiziksel ışık modelleri.
  • MIS (Multiple Importance Sampling): Günümüz modern Hollywood film render motorlarının (Pixar RenderMan, Arnold, Cycles) kullandığı tepe matematik algoritmaları.

3. Diğer İleri Yönler (Other Directions)

  • SIMD ve Paralelleştirme: OpenMP veya C++17 std::execution::par ile tüm CPU çekirdeklerini %100 kullanmak.
  • GPU Hızlandırma: OptiX, Vulkan Ray Tracing veya DXR (DirectX Raytracing) ile ışın izlemeyi ekran kartında gerçek zamanlı (60 FPS) çalıştırmak.
  • İki Yönlü Yol İzleme (Bidirectional Path Tracing): Hem kameradan hem ışıktan ışınlar fırlatarak cam altındaki odaklanmış parlak ışık desenlerini (kaustikleri / caustics) kusursuz yakalamak.

Eser Atıfı ve Kaynakça (Citing This Book)

Bu kitabı akademik çalışmalarınızda, tezinizde veya projelerinizde kaynak göstermek isterseniz:

BibTeX

@misc{Shirley2024RTW1,
   title = {Ray Tracing in One Weekend},
   author = {Peter Shirley, Trevor David Black, Steve Hollasch},
   year = {2024},
   month = {April},
   note = {\\small \\url{https://raytracing.github.io/books/RayTracingInOneWeekend.html}},
   doi = {10.48550/arXiv.2011.13035}
}

IEEE

P. Shirley, T. D. Black, and S. Hollasch, Ray Tracing in One Weekend. 2024. [Online]. Available: https://raytracing.github.io/books/RayTracingInOneWeekend.html

Teşekkür

Bu Türkçe çeviri, Peter Shirley, Trevor David Black ve Steve Hollasch'ın açık kaynak vizyonu ve CC0 lisanslı cömert katkıları sayesinde Batuhan Dev (kuantumania) tarafından Türk yazılım ve grafik topluluğuna kazandırılmıştır.

Emeği geçen tüm bilgisayar grafikleri öncülerine sonsuz saygıyla! 🚀