2 puan yazan GN⁺ 2 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • OpenGL, Vulkan, Metal ve DirectX’in içeride nasıl çalıştığını anlamak için harici grafik kütüphanesi kullanmadan yazılım renderer’ı sıfırdan gerçekleştiriliyor
  • Üçgen mesh ve dokulardan oluşan 3D modeli görüntüye dönüştürüyor; GUI veya GPU uygulaması geliştirme konularını ele almıyor
  • Tamamlanmış kod yaklaşık 500 satır; öğrenciler genellikle 10–20 saat ayırarak çalışan bir renderer oluşturmaya başlıyor
  • RGB, RGBA ve gri tonlamayı destekleyen bir TGA işleme sınıfı ile yalnızca tek piksel ayarlama işlevi veriliyor; çizgi parçaları ve üçgen çizimi doğrudan gerçekleştirilmeli
  • Hazır kodu kopyalamak yerine kendiniz yazmak, rendering kavramlarını ve 3D kütüphanelerin iç işleyişini anlamak için gerekli

Rendering pipeline’ını doğrudan oluşturma süreci

  • Modern 3D grafik kütüphanelerinin yapısını gevşek biçimde izleyerek rendering pipeline’ının nasıl çalıştığı öğreniliyor
    • GPU uygulaması yazmak yerine, iç işleyiş bir yazılım renderer’ı ile yeniden üretiliyor
    • Girdi, üçgen mesh ve dokulardan oluşan bir 3D model; çıktı ise render edilmiş görüntü
    • Program, grafik arayüz olmadan bir görüntü dosyası oluşturuyor
  • Harici bağımlılıkları azaltmak için basit bir görüntü biçimi olan TGA kullanılıyor
    • Başta sağlanan işlevler yalnızca görüntü yükleme/kaydetme ve tek bir pikselin rengini ayarlama
    • Çizgi parçası veya üçgen çizen yerleşik fonksiyon yok; hepsi doğrudan yazılmalı
  • Başlangıç örneği 64x64 RGB framebuffer oluşturup üç koordinattaki pikselleri beyaza ayarladıktan sonra framebuffer.tga olarak kaydediyor
    • Renk değerleri BGRA sırasıyla belirtiliyor

Kodu derleme ve çalıştırma

git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
cmake -Bbuild &&
cmake --build build -j &&
build/tinyrenderer obj/diablo3_pose/diablo3_pose.obj obj/floor.obj
  • Çalıştırma sonucu framebuffer.tga içine kaydediliyor
  • Tamamlanmış kod yaklaşık 500 satır olsa da, kavramları anlamak için doğrudan gerçekleştirme süreci şart olduğundan sağlanan kodu aynen kullanma yöntemi önerilmiyor

1 yorum

 
GN⁺ 2 시간 전
Hacker News yorumları
  • Birkaç ay önce Rust ile, LLM kullanmadan kendi başıma bir yazılım render’ı uyguladım; basit bir oyun ile pikselli shader ve el feneri kenarlarındaki renk sapması efektini de ekledim
    https://github.com/kshitijl/tinyrenderer-rs
    Depoda geliştirme sürecini ve komik görsel hataları gösteren çok sayıda ekran görüntüsü var. Yalnızca render ilkelerini değil, modern CPU’ların çok hızlı olduğunu ve tek iş parçacıklı CPU render’ı ile bile gösterişli özel efektlere sahip etkileşimli bir 3D oyunun çalıştırılabileceğini de fazlasıyla öğrendim
    • Yazılım render’ıysa neden wgpu’ya bağımlı olduğunu merak ediyorum
    • Rust ile oyun mantığı yazarken ECS eklemek zorunda kalacak kadar gerekli mi, merak ediyorum
  • Bu kaynak ve John Vince’in Mathematics for Computer Graphics kitabı, kendi yazılım render’ımı yapmam için vazgeçilmezdi
    LLM öncesi dönemdi; en az iki ay sürdü ve zamanın çoğunu bilgisayar grafikleri matematiğini anlamaya ve C segmentasyon hatalarını izlemeye harcadım
    • Birkaç ay boyunca günde kaç saat çalıştığını merak ediyorum
  • Foley ve Van Dam’in kitabının hâlâ bu alandaki başlıca referans olup olmadığını merak ediyorum. 2013’te güncellendi ama ben 2D ağırlıklı 1982 baskısına daha aşinayım; o dönemde bilgisayar grafiklerinin standart kitabı gibiydi
    • Uzun zamandır tekrar açıp bakmadım; benim için daha çok tarihsel değeri olan kendine özgü bir ansiklopedi gibi
      Bu GitHub’daki ders notları kavramları tazelemek için daha iyiydi. Depodaki kod stilini beğenmiyorum ve eski tip rasterizer da aşırı basit ve verimsiz, ama yine de Foley’nin kitabından daha okunabilir olduğunu düşünüyorum
    • Ben de 2. baskıyla öğrendim ve 2013’teki son baskıya da sahibim; fena sayılmaz
      Baskılar değiştikçe kullanılan dil de Pascal’dan C’ye, ardından C ve C++’a evrildi; son baskıda biraz C# da var. Birçok yeni kavram eksik, ama hâlâ değerli içerik barındırdığını düşünüyorum
  • Keşke yazılım render’ı eğitimlerinden en az biri üçgen kırpmayı doğru düzgün ele alsa. Pratik bir render’da, basit sahnelerde bile geometri görüntüleme kesik piramidiyle kesiştiğinde bunun mutlaka ele alınması gerekir; kişisel olarak en zorlandığım kısım bu
    • Bu konuya bir bölümün tamamı ayrılmış: https://gabrielgambetta.com/computer-graphics-from-scratch/11-clipping.html
    • Üçgen kırpma yalnızca çok büyük üçgenlerde nitelik enterpolasyonu önemli olduğunda gerekir; iki yöntem vardır: hızlıca elemek veya primitifleri sentezlemek
      Kesik piramit kırpması, yerel tile’daki noktaların seçimiyle ele alınabilir; primitif sentezinde ise ters dönüştürülmüş kırpma dikdörtgenini barisantrik koordinat sisteminde ele almak daha kolaydır. Çift duyarlık ya da sabit nokta ile yuvarlama hataları kontrol edilebilir; asıl zor nokta yeni köşelerin Z ve 1/Z değerlerini yeniden üretmektir. Gecikmeli nitelik sentezli bir rasterizer’da geri kalan kısım doğal olarak pipeline’dan geçer; örnekleri OpenSWR.org’un açık kaynak uygulamasında görebilirsiniz
    • Ben de hep “kırpmayı uygulamam gerek” aşamasında takılıyordum; ama sonunda çok zorlanmadan çalışan kodu yazdım ve ancak sonradan bunun Sutherland–Hodgman algoritmasını bağımsız olarak yeniden keşfetmek olduğunu fark ettim
      En büyük psikolojik engel, projeksiyon uzayı ve homojen koordinatların yabancılığı. Clip space’teki altı düzlem x = ±w, y = ±w, z = ±w kadar basittir; her poligon kenarını dolaşıp iki uç noktanın içeride/dışarıda olup olmadığını belirler ve sınır kesişim noktasının konumu ile tepe niteliklerini doğrusal enterpolasyonla bulursunuz. Bu süreci tüm düzlemlere sırayla uyguladığınızda üçgen en fazla 9 köşeli dışbükey bir poligona dönüşür ve kolayca yeniden üçgenlere ayrılabilir. Outcode’ları önceden hesaplarsanız tamamen içeride ya da dışarıda kalan üçgenlerde kırpmayı atlayabilirsiniz
      Makale: https://dl.acm.org/doi/10.1145/360767.360802
  • Modern ortamlarda aslında saf C++ diye bir şey yok. 1980’lerin bilgisayarları gibi yazmaçlara ve VRAM’e doğrudan yazarak görüntü üretemezsiniz; sonuçta kalın API, sürücü ve firmware katmanlarının üzerinde çok sayıda koda bağımlı olursunuz
  • 1990’lar nostaljisiyle yazılım render’ını yeniden deniyorum; 2D tarzı CLUT bank ile modern aralık sınıflandırmalı üçgen ve barisantrik koordinat tekniklerini karıştırıyorum
    Sabit pipeline biçimini korursanız oldukça basit çizim fonksiyonlarıyla bile şaşırtıcı sayıda üçgen işleyebilirsiniz
  • macOS’in OpenMP işleme hatasını keşfedip çok uzun zaman sonra bu depoya ilk PR’ımı gönderdim