1 puan yazan GN⁺ 2024-05-25 | 1 yorum | WhatsApp'ta paylaş
  • 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
  • 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

 
GN⁺ 2024-05-25
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

    • Katılıyorum. Kişisel olarak düşük poligonlu Doom/Wolfenstein hissinden çok piksel art/retro havasını daha güçlü çağrıştırıyor
    • Bu estetikle yapılmış bir 3D Noita hayal ettiriyor
      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
    • Estetik konusunda tamamen katılıyorum ama bu kadar harika görünmesine kıyasla mimari yapı garip hissettiriyor
      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

    • Blog yazısını düzgün okuduysam, bu dokudan normal map çıkarımı yapan bir model; geometriyi render etmek için yeni bir yöntem değil
      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
    • Yazıda da söylendiği gibi normal map her durumda “çalışmaz”
      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...

    • Yazıda Voxel Doom dipnotu var ama canavarlardan çok Voxel Doom’un çevre yaklaşımı hakkında
      “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)

    • Orijinal yazı çalışma zamanında kullanılan mesh’i ayrıntılı açıklamadığı için kesin konuşmak zor ama Nanite’tan oldukça farklı olduğunu tahmin ediyorum
      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

    • Tahminimce Comanche oyunlarında kullanılan teknikle tam olarak aynı, ya da en azından aynı sonucu üretebilecek bir yöntem
      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
    • Aslında neredeyse hiç alakası yok. Burada geometri shader’ı ile voxel mesh ayrıntısı oluşturuluyor ve muhtemelen birkaç ince adım optimizasyonu da yapılıyor
      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