- 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
Hacker News yorumları
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
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
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
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
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
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 = ±wkadar 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ı atlayabilirsinizMakale: https://dl.acm.org/doi/10.1145/360767.360802
Sabit pipeline biçimini korursanız oldukça basit çizim fonksiyonlarıyla bile şaşırtıcı sayıda üçgen işleyebilirsiniz