Voksel Displacement Renderer – Retro 3D Estetiğinin Modernleştirilmesi
(blog.danielschroeder.me)- Daniel Schroeder, 90'ların 3D oyunlarındaki pikselleşmiş yüzey hissini küçük voksel yüzey detaylarıyla genişleten gerçek zamanlı bir renderer geliştiriyor; girdi varlıkları olarak tanıdık düşük poligonlu üçgen mesh'ler ve dokular kullanılıyor
- Tüm sahneyi bir voksel ızgarasına dönüştürmek yerine, yalnızca yüzeyi vokselmiş gibi göstermek için displacement map kullanıyor; böylece Doom, Quake ve Duke Nukem tarzı statik ortamlara uygun bir görsel stil hedefleniyor
- CPU, üçgen mesh'leri ve sınırlı displacement bilgisini GPU için geometri verisine dönüştürüyor ve dokuları ön işliyor; kare render'ı ise GPU tarafından neredeyse bağımsız biçimde yürütülüyor
- Demo, Radeon RX 5700 XT'de 1440p'de 4~9 ms frame time gösteriyor; Steam Deck OLED'in 800p çözünürlüğünde ise 60FPS üzeri ve birçok bölümde sabit 90FPS seviyesine ulaşıyor
- Ortam hâlâ üçgen mesh olarak ele alınabildiği için çarpışma, karakter denetleyicisi ve yol bulma mevcut fizik kütüphaneleri ve mesh tabanlı işlemlerle çözülebiliyor; yalnızca gerekli bazı sistemlerin voksel detaylarının farkında olması gerekiyor
90'lar 3D estetiğini voksel yüzeylerle genişletmek
- Amaç, klasik 90'lar 3D oyunlarının sade çevre geometrisini ve keskin doku sınırlarını korurken, yüzeylere blok biçimli 3D detay eklemek
- Doom, Quake ve Duke Nukem gibi erken ve orta dönem 90'lar 3D oyunları hem teknolojiye hem oynanışa büyük etki yaptı; son yıllarda ise o dönemin görsel sınırlamaları bile retro çekiciliğin parçası olarak görülüyor
- Çıkış noktası şu soru: “Piksel yerine voksel ile yüzey detayı üretsek nasıl olurdu?”
- Örneğin bir parke taşı duvar, yakından da pikselleşmiş hissini korurken geometrik derinliğe sahip olabilir
- Sonuç, 90'lar oyunlarının görünümü ile daha modern bir anlatımın arasında bir yerde duracak şekilde tasarlanmış
Yaygın voksel yaklaşımının kısıtları
- Tipik bir voksel mesh, her kübik hücrenin dolu mu boş mu olduğunu gösteren üç boyutlu bir ızgaradır
- Minecraft'taki gibi büyük voksel bloklara doku uygulanabilir
- Teardown'daki gibi küçük ve tek renkli vokseller de kullanılabilir
- Voksel tabanlı bir ortam üretmek için tüm geometriyi ortak bir ızgaraya yerleştirmek ya da birden fazla bağımsız voksel mesh'i aynı uzaya koymak gerekir
- Doğrudan voksel geometri üretmeye yarayan araçlar var, ancak üretim süreci uzun olabiliyor ve çoğu zaman küçük mesh üretimiyle sınırlı kalıyor
- Karo tipi duvar veya zemin gibi yapı taşları hazırlanıp büyük yapılar birleştirilebilir; ancak bu yaklaşım ızgaraya hizalı binalar için iyi çalışırken serbest biçimli arazi için pek uygun değil
- Prosedürel üretim doğal ortamlar ve yapı taşı kombinasyonları için faydalı olabilir, fakat kendi içinde zorluklar taşır ve yalnızca belirli oyun türlerine uygundur
- Mevcut üçgen mesh'leri voksel ızgarasına rasterize etmek de mümkün, ancak ortaya çıkan geometri tek bir voksel ızgarasına oturduğundan istenmeyen estetik sonuçlar doğabilir
- Eksene hizalı yüzeyler düz voksel levhaları gibi görünebilir, 45 derece yüzeyler ise merdiven basamağı gibi durabilir
- Sahnenin asıl temsili voksel olduğunda, sadece render değil fizik, karakter denetleyicisi ve NPC yol bulma gibi oyun mantığı da voksel düzeyinde çalışmak zorunda kalabilir
- Buna karşılık Minecraft ve Teardown'da olduğu gibi voksel mesh üzerinde geometri ekleyip çıkarmak kolaydır
Yaygın displacement yaklaşımının sınırları
- Displacement mapping, dokuya ek olarak bir displacement map kullanarak, dokudaki her pikselin mesh yüzeyinde içeri ya da dışarı ne kadar kaydırılacağını tanımlar
- 3D modelleme yazılımları, mesh'i alt bölümlere ayırdıktan sonra yeni köşeleri taşıyarak displacement'ı gerçek geometriye dönüştürebilir
- Bu yaklaşım nesnenin siluetini de etkiler
- Ortaya çıkan mesh'in poligon sayısı ciddi biçimde artar
- Sert kenarları veya köşeleri olan giriş mesh'leri iyi sonuç almak için değişiklik gerektirir
- Gerçek zamanlı grafikte parallax occlusion mapping gibi yüzey gölgelendirme efektleri, gerçek şekli değiştirmeden ince geometri varmış gibi gösterebilir
- Büyük zemin ve duvarlarda iyi görünebilir
- Nesne kenarlarında geometri hâlâ düz kaldığı için illüzyon bozulur
- shell mapping, aşırı derecede alt bölümlere ayrılmış bir mesh olmadan da nesne siluetinde displacement'ı görünür kılan ara bir yaklaşımdır
- Girdi mesh'inin eğriliğinin yüksek olduğu bölgelerde kullanımı zordur
- Sert kenarlı veya köşeli giriş mesh'lerini bu tekniğe uyarlamak da kolay değildir
Uygulama yöntemi: voksel ile displacement mapping'in birleşimi
- Bu renderer, klasik 3D oyun benzeri ortamları düşük poligonlu üçgen mesh olarak oluşturuyor, displacement map ile voksel ölçeğinde yüzey detayını tanımlıyor ve ardından bunları gerçekten vokselden inşa edilmiş gibi render ediyor
- Çok sayıda keskin kenara sahip bina köşeleri gibi ortamları hedeflediği için, normal displacement mapping'in zorlandığı bölgelerde de voksel benzeri sonuçlar üretmesi gerekiyor
- Mevcut uygulama bağımsız bir C++ / Vulkan projesi
- Altyapı üç temel iş yapıyor
- Üçgen mesh ve sınırlı displacement map bilgisini alıp, GPU'nun dönüştürülmüş mesh'i çizerken kullanacağı geometri verisine dönüştürüyor
- Bu işlem frame render'dan önce CPU üzerinde çalışıyor
- Yayınlanmış bir oyunda sonuçlar diske bake edilebilir
- Videodaki tüm demo ortamının dönüşümü tek iş parçacığında 0,5 saniye sürüyor
- Dokuları ön işleyerek render sırasında gereken normal map gibi bilgileri üretiyor
- İşin kendisi temel olsa da yavaş, bu yüzden bake etmek uygun
- Üretilen mesh ve doku durumunu kullanarak GPU üzerinde voksel displacement geometrisini çiziyor
- Frame başına CPU katılımı neredeyse yok
- Üçgen mesh ve sınırlı displacement map bilgisini alıp, GPU'nun dönüştürülmüş mesh'i çizerken kullanacağı geometri verisine dönüştürüyor
- Performans şimdiden pratik kullanım düzeyinde
- Radeon RX 5700 XT'de demo sekansı 1440p'de 4~9 ms frame time ile render ediliyor
- Bu da yaklaşık 250~110FPS'e karşılık geliyor
- Steam Deck OLED'in doğal 800p çözünürlüğünde 60FPS üzeri korunuyor ve birçok bölümde 90FPS'e sabitleniyor
Sanat varlıklarının üretim biçimi
- İçerik üretimi için iki tür varlık gerekiyor: dokular ve mesh'ler
- Her doku bir albedo map ve displacement map ile hazırlanıyor
- albedo, retro oyunların sınırlı paletini taklit ettiğinde görsel stili daha inandırıcı kılmaya yardımcı oluyor
- displacement map ince yükseklik değerleri sağlıyor ve renderer içinde ölçek ayarlanarak etkisi değiştirilebiliyor
- Ölçeklendirmeden sonra yükseklik birimi, yüzeyin içeri ya da dışarı kaç voksel kaydırılacağını ifade ediyor
- Renderer yalnızca en yakın tam sayı voksel birimine göre yer değiştiriyor, ancak hassas yükseklik değeri normal map hesaplamasında kullanılıyor
- Bir vokselden daha alçak detaylar bile aydınlatmayı etkileyebilir
- Mesh'ler, shading normal'larına sahip sıradan düşük poligonlu, doku eşlemeli üçgen mesh'lerdir
- Normal'lar hangi bölümlerin yumuşak kıvrımlı yüzey, hangi kenarların keskin kenar olduğunu gösterir
- Renderer, keskin kenarlarda iyi sonuç üretmek için ek işlemler yapar
- Görsel stil için doku eşleme sırasında voksel boyutunun tutarlı kalması tercih ediliyor, ancak bu zorunlu değil
- Mesh yapısı ve doku eşlemede bazı kısıtlar var
- Bazı kısıtlar ileride kaldırılabilir
- Bazıları ise renderer'ın çalışma biçimi nedeniyle kaçınılmaz
- Varlıklar özel bir voksel gösterimi değil, üçgen mesh olduğu için birçok araçla üretilebiliyor
- Demo ortamı Blender ile modellenmiş
- Şu anda Blender'dan demoya dışa aktarılan biçim OBJ dosyası
Oyun geliştirmedeki avantajlar ve kullanım alanı
- Bu yaklaşım, özel voksel düzenleme araçları yerine tanıdık iş akışlarıyla içerik üretmeyi mümkün kılıyor
- İyi doku üretmek zor olabilir, ancak bir kez üretildikten sonra farklı geometrilerde yeniden kullanımı kolaydır
- Video demosundaki geometrinin önemli bir kısmı, üç renkli tek bir taş blok dokusu kullanıyor
- Ortam üçgen mesh olarak üretildiği ve voksel özellikleri yüzey süsü olduğu için, uygun olduğunda çevreyi poligon geometri olarak ele almak mümkün
- Demo uygulaması birinci şahıs hareketi, çarpışma, merdiven çıkma ve duvar çarpışmasını destekliyor
- Kendi fizik motorunu veya karakter denetleyicisini yazmıyor
- Açık kaynaklı Jolt Physics entegre ediliyor
- Orijinal üçgen mesh çarpışma geometrisi olarak kullanılıyor
- Düşman hareketi ve yol bulma da aynı mesh üzerinden çözülebilir
- Yalnızca bazı oynanış sistemlerinin voksel farkındalığına sahip olması gerekiyor
- Örneğin birinci şahıs nişancı oyununda, mermilerin yer değiştirmiş geometrinin tam şeklini izlemesi için displacement-aware bir raycast işlevi uygulanabilir
- Pek çok voksel tabanlı oyun, çeşitli oyun sistemlerini özel olarak geliştirmek zorunda kaldığı için kendi motorunu kullanıyor; bu yaklaşımda ise render dışındaki mantığın büyük bölümü voksel ölçeğindeki detaylardan habersiz kalabiliyor
- Bu render tekniğini mevcut motorlara entegre etmek en gerçekçi yön gibi görünüyor
Kalan zorluklar ve sonraki adımlar
- Mevcut uygulama seviye geometrisi üretimi için iyi çalışıyor, ancak oyun ortamlarında küçük nesneler, süslemeler ve düşmanlar gibi dinamik öğelere de ihtiyaç var
- İleride küçük nesneleri veya animasyonlu nesneleri bu sanat stiline dahil etmenin yolları eklenmesi planlanıyor
- Demodaki aydınlatma şimdiden iyi görünüyor, ancak mevcut uygulamanın sınırlamaları var
- Yalnızca az sayıda ışık destekleniyor
- Gölge, ambient occlusion ve daha gelişmiş özellikler yok
- Bu renderer, tipik voksel oyunlarındaki çok dinamik geometri yerine, çoğu oyunda bulunan büyük ölçüde statik ortamları hedefliyor
- Uygulamanın ihtiyaçlarına göre bake yaklaşımları da dahil olmak üzere farklı aydınlatma çözümleri için alan var
- Şu anda anti-aliasing yok ve bu durum özellikle uzak zeminlerde fark ediliyor
- Projenin gelecek planları ve geliştirici/stüdyolara yönelik tartışma ikinci yazıda devam ediyor
1 yorum
Hacker News yorumları
2400 baud modemle oyun indirdiğim günleri hatırlayacak kadar yaşlı olduğumdan mıdır bilmem, bu estetik bana gerçekten çok çekici geliyor
Video da harikaydı ve kişisel olarak bende güçlü bir atmosfer hissi uyandırdı
Çatının çok alçak olduğu bölümlerde klostrofobi ve boğulma hissi bile hissettim; kayalar ve kum zeminli mağaralar, kayalı mağaralar gerçekten güzeldi, bu renderer ile yapılmış Myst veya LucasArts tarzı bir macera oyunu oynamak istedim
Mağara keşfi ya da arkeolojik kazı gibi temalara iyi uyacak gibi
Düşen kum motorunu 3D’ye genişletmek için pürüzsüz parçacık akışkanlar dinamiği gibi yöntemler de kullanılabilir gibi
Alçak tavanlı kısımlarda tavandan sarkan bloklar fizik kurallarına meydan okuyormuş gibi görünüyordu
https://web.archive.org/web/20240524065427/https://blog.dani...
https://www.youtube.com/watch?v=1xFEbXWstCM
Başka bir yaklaşım olarak Deep Bump var. Aynı problemi tamamen farklı bir yolla ele alıyor
Deep Bump, doku görsellerinden makul görünen normal map’ler üreten bir makine öğrenmesi aracı
Bu voksel displacement renderer’ın kullandığı taş veya tuğla dokularına özellikle iyi uyuyor; kumaş dokularında da kırışıklık, cep ve yakaları bir ölçüde tanıyıp derinlik hissi veren normal’ler sağlıyor
Ağaç kabuğunda idare eder, bitkilerde ise pek iyi değil; muhtemelen eğitim veri kümesinin etkisi
Doom/Wolfenstein türü oyunları modernize edecekseniz kullanılabilir bir açık kaynak araç zaten var
[1] https://github.com/HugoTini/DeepBump
Bu yazı, displacement map’i küçük voksel tabanlı bir temsil olarak ele almaya daha yakın; Deep Bump gibi araçlar ise burada bahsedilen sistem için doku varlıkları üretmede yardımcı olarak kullanılabilir gibi
Gerçek geometriyi değiştirmeyip yalnızca ışıklandırma ve hacim algısı yanılsamasını değiştirdiği için, mesh kenarlarından bakıldığında displacement hâlâ daha kaliteli bir seçenek
Yine de DeepBump, geleneksel displacement için kullanılacak tek boyutlu height map’i, yani tam 3D vektör displacement yerine yalnızca yükseklik içeren map’i çıkarmakta işe yarayabilir
Güzel görünüyor ama bu yaklaşımın animasyonlu 3D modellere ne kadar uyacağını merak ediyorum
En iyi ihtimalle Doom’un “Voxel Doom” modu gibi görünecek sanki
[1] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
[2] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
“Artık tüm bu bağlamı açıkladığıma göre, klasik Doom için Voxel Doom modunu takdir etmek istiyorum. Mod yapımcısı oyunun canavarlarını ve diğer sprite’larını voksel mesh’lere dönüştürerek derinlik kattı; gerçekten etkileyici bir işti. Daha sonra 2022’nin sonlarında, level geometrisine voksel detay eklemek için parallax mapping denemeye başladı. Bana göre bu kısım pek iyi görünmüyordu; sebebi yapımcının artwork’ü değil, parallax mapping ile render ederken ortaya çıkan temel sınırlamalardı. Bu mod benim projemin ilham kaynağı değildi. Ben zaten çalışıyordum. Ama o modun internette iyi tepki aldığını görmek, kendi çalışmama devam etmem için bana büyük güç verdi. ↩”
Yaklaşımın animasyonlu kapılar gibi şeyleri de desteklediği söyleniyor; dolayısıyla mesh ve doku flipbook’ları birleştirilirse, orijinal Doom gibi görünen canavarlarda da kullanılabilir gibi
Yine de keskin eğrilik bölgelerinde artifact’lerin shell mapping’de en kötü olacağını düşünüyorum; level’i mesh’e dönüştürmenin sınırlamalarından da bahsedildiği için olmayabilir de
Notch’un üzerinde çalıştığı şeye epey benziyor. Twitter akışına bakarsanız başka bir tür voksel rendering yaptığını görürsünüz
Ancak bu C++/Vulkan kullanıyor ve gerçekten harika görünüyor
Bu yaklaşımın Unreal Engine 5 Nanite ile nasıl karşılaştırıldığını merak ediyorum. Belki Unreal Engine de benzer bir şey yapıyordur
Comanche[1] gibi eski oyunlarda voksel kullanılmasının motivasyonlarından birinin, üçgen mesh’le modellendiğinde benzer donanımda daha pahalıya gelecek karmaşık araziyi makul biçimde elde etmek olduğunu hatırlıyorum
Yazar RX 5700 XT’de 110FPS’ten bahsediyor ama diğer yaklaşımlarla kıyaslayınca bunun ne düzeyde olduğunu pek bilmiyorum
[1] https://en.wikipedia.org/wiki/Comanche_(video_game_series)
Nanite, yüksek poligonlu nesne üretimini varsayıyor ve render edilen üçgenler pikselden küçük olmayacak şekilde basitleştirilmiş chunk’ları stream ediyor
Geometri doğal olarak çok ayrıntılı yapılabildiği için displacement map biraz gereksiz kalıyor; bunu özellikle texture map olarak ele almak için de pek sebep yok
Elbette arazi için ayrı durumlar var ama bu özel bir vaka
Bu yazıdaki yöntem, displacement ve düşük poligonlu mesh kullanarak yükleme sırasında yüksek poligonlu ama “vokselleştirilmiş” geometri oluşturuyor gibi görünüyor
Hatırladığım kadarıyla Comanche arazi render’ı için ışın izlemeye dayalı bir yaklaşım kullanıyordu[1]
Gerçek voxel değildi; örneklenen bir 2B yükseklik haritasıydı
Adını “VoxelSpace” koydukları için kafa karıştırması anlaşılır
[1] https://github.com/s-macke/VoxelSpace
Yaygın inanışın aksine o oyunlar gerçek 3B voxel kullanmıyordu; arazi dokusunda renk ve yükseklik değerlerini saklayan bir yükseklik haritasını ray marching ile çiziyordu
Shader’da dokuya doğru ray marching yaparsanız aynı görünümü yeniden üretebilirsiniz ve bunun blog yazısında elde edilen sonuca çok benzeyeceğini düşünüyorum
Buna karşılık Nanite, hedef kaliteye göre üçgen yoğunluğunu ayarlayan GPU odaklı bir render teknolojisi
Nanite da displacement map ve tessellation kullanabilir, ancak yüksek poligonlu varlıkları olduğu gibi içe aktarıp render etmekten mutlaka daha verimli olmayan ayrı bir yol kullanır
Voxel alanında yeni yöntemler görmek her zaman güzel
Yine de yazının voxel ile belirli bir render tekniğini birbirine karıştırması biraz üzücü
Voxel sadece 3B ızgara kullanmak demek; orta kısma bakınca yazarın voxel kullanımını küp tabanlı render ile, yani genelde Minecraft tarzı blockxel renderer denen şeyle özdeşleştirdiği anlaşılıyor
Üçgen geometrisini alıp motorda doğrudan kullanabileceğini de söylüyor ama blockxel’in ya da aslında neredeyse her render sürecinin aynı şeyi yapabileceğini unutmuş gibi
Farklı stiller kullanan genel voxel render eklentilerinin mevcut motorlarda birinci sınıf destek almasının yolu da zaten tam olarak bu
Keşke bu açık kaynak olsaydı. Gerçekten keşke
Gerçekten çok hoşuma gitti. Ultima Underworld’ü hatırlatıyor
Retro 3B oyun modernizasyonunun geleceği bu olmalı. Gerçekten çok güzel