- Revision 2025 için hazırlanan Nintendo 64 demosu, tüm dokuyu yeniden hesaplamak yerine yalnızca paleti güncelleyerek normal mapping, baked aydınlatma ve gerçek zamanlı specular'a yakın efektler üretiyor
- CPU her palet indeksinden normal ve difüz rengi okuyup yeni bir RGB paleti oluşturduğunda, palet dokusu her texel ayrı ayrı aydınlatılmış gibi tepki veriyor
- Difüz doku ve normal map aynı palet indekslerini paylaşıyor ve scikit-learn'ün K-means clustering yöntemiyle 6 kanallı bir görüntü gibi birlikte üretiliyor
- Bina aydınlatması; köşe RGB'sindeki ambient renk, köşe alfa kanalındaki güneş görünürlüğü, gri bir irradiance map ve yönlü güneş ışığı için
dot(N, sun_dir) birleşimiyle oluşturuluyor
- Yönlü difüz ışıkta etkili olsa da gölgeler, point light'lar, doğru specular ve tekrar eden doku kullanan büyük modellerde ciddi kısıtlar var; bu yüzden sınırlamalar ön işleme ile gizlenmek zorunda
Yalnızca paleti güncelleyerek gölgelendirme
- Nintendo 64 demosu Revision 2025 için üretildi ve baked aydınlatma, normal mapping ve gerçek zamanlı specular shading'e yakın efektler kullanıyor
- N64 üzerinde normal mapping'in mümkün olduğu önceki homebrew denemelerinden biliniyordu; bu demo ise çalışma anında dokuyu değil aydınlatma sonucu oluşan paleti hesaplamayı seçiyor
- Özel donanım desteği olmadan CPU üzerinde keyfi shading kodu çalıştırılabiliyor, ancak hesaplama hızı düşük
- Paletli dokularda tüm texel'leri değil sadece paleti değiştirmek, bütün doku aydınlatma hesabından geçmiş gibi görünmesini sağlıyor
- Orijinal palet, gölgelendirilmiş paletle değiştiriliyor
- Paletli doku, normal bir doku gibi nesneye uygulanıyor
- Basit difüz ışık
dot(N,L) bile oldukça iyi sonuç veriyor
- İlk örnekte renk dokusunun gamma düzeltmesi geri alınarak lineer uzayda gölgelendirme yapıldı, ancak nihai demoda ambient ve direkt ışık terimlerinin ayrılması ve N64'ün RDP biriminde donanım üzerinden birleştirilmesi gerektiğinden bu uygulanamadı
Nesne uzayı normal mapping
- Yaygın normal mapping yaklaşımı teğet uzayında yapılır
- Tekrarlayan dokular kullanılabilir
- Ayrıntı normalleri, yumuşak geçişli köşe normallerini düzeltebilir
- Tek renkli bir teğet uzayı normal map, pürüzsüz bir yüzeyi temsil eder
- Nesne uzayı normalleri daha basit hesaplama sunar ama ciddi kısıtları vardır
- Normal map texel'leri, köşe normallerinden sapmayı değil mutlak yüzey normalini gösterir
- Çalışma anındaki hesaplama, dokudan renk okumak kadar basit hale gelir
- Her yüzey noktası için lightmap benzeri benzersiz texel gerekir
Difüz doku ile normal map'in aynı paleti paylaşması
- Nesnede hem difüz doku
basecolor * ao hem de normal map bulunur
- İki doku aynı palet indeksini paylaşır ve bu indeks scikit-learn'ün K-means clustering yöntemiyle üretilir
- Görüntüler tek bir 6 kanallı görüntü gibi yorumlanır
- Tek bir indeksle hem normal hem de yüzeyin difüz rengi alınabilir
- Yükleme anında ya da her karede palet renkleri dolaşılır
- CPU shader kodu her indeks için yeni bir RGB renk üretir
- Döngünün sonucu, aydınlatma uygulanmış yeni palet olur
- Bu yaklaşım pratikte en çok yönlü aydınlatma için uygundur
- Yalnızca paletle gölge gibi efektleri ifade etmek zor olduğundan, baked aydınlatma ile birleştirilmesi gerekir
Baked yönlü ambient ve güneş ışığı
- Demodaki binalarda daha gerçekçi aydınlatma için ambient ve doğrudan güneş ışığı, köşe renklerinde ayrı ayrı saklanır
- Köşe RGB: ambient renk
- Köşe alfa: güneş görünürlüğü
- Ambient terimi, yönlü yoğunluk ve renk olarak ayrılır
- Yönlü yoğunluk, gri tonlu bir irradiance maptir
- Renk ise doygunluğu artırılmış köşe RGB'sidir
- Güneş bir yönlü ışıktır ve görünürlük köşe alfa ile taşınır
- Gölgelendirme formülü şöyledir
ambient = vertex_rgb * grey_irradiance_map(N)
direct = vertex_alpha * sun_color * dot(N, sun_dir)
color = diffuse_texture * (ambient + direct)
- Dağınık görünen güneş görünürlüğü köşe renkleri,
N.L hesabıyla maskelenerek nihai direkt ışık sonucunda daha derli toplu görünür
- Yönlü ambient, baked aydınlatma kaba olsa bile doku ayrıntıları sayesinde sonucu oldukça kaliteli gösterebilir
- Bulanık environment map için basitliği nedeniyle equirectangular projection kullanılır
- Polyhaven HDRI zaten bu projeksiyonu kullanır
- Gölgelendirme yükleme sırasında önceden hesaplandığından, karmaşık örnekleme matematiği sorun olmaz
Tekrarlayan doku kullanan büyük modellerin işlenmesi
- Orijinal gölgelendirme algoritması tek bir nesne için tasarlanmıştı ve ilk başta yalnızca
potato_rock.obj ile test edildi
- Demonun kale mesh'inde tekrarlayan dokular bulunduğundan sorun ortaya çıktı
- Geçici çözüm, büyük mesh'i birden fazla alt mesh'e ayırmak ve her alt mesh'in kavramsal olarak aynı nesne uzayı normal map'ini paylaşıyormuş gibi davranmasını sağlamak oldu
- Blender içinde geometri, malzeme ve yüzey yönüne göre elle gruplandı
- Her grubun poligon normallerine dayanarak world-to-model matrisi hesaplandı
- Bu matris yaklaşık bir teğet uzayına karşılık geliyor
- Her grup paleti paylaştığı için genel aydınlatma ancak ortalama bir anlamda doğru oluyor
- Teğet uzayı çalışma anında enterpole edilmediğinden sonuç yüz başına aydınlatma gibi görünüyor; bu da tekniğin en büyük dezavantajlarından biri
Specular shading'in yaklaşık hesabı
- Birçok yüzey noktası aynı gölgelendirme rengini paylaştığından point light veya specular shading'i doğru hesaplamak zor
- Palet uzayı yaklaşımı,
to camera vektörü V gerektirmeyen difüz yönlü aydınlatma için çok uygun
- Specular efekt, nesneyi bir küre gibi yaklaştırarak deneniyor
- Gölgelendirilecek nokta
p, p = radius * normal olarak alınıyor
- Birçok yüzey noktası aynı palet indeksini paylaştığı için sonuç kaçınılmaz olarak köşeli görünüyor
- Demodaki specular parlama biraz tuhaf görünse de çoğu kişiyi kandıracak kadar işe yarıyor
Sınırlamalar ve ilgili kaynaklar
- Demoda temel sınırlamalar ön işleme ve sahne kurulumu ile gizlenmeye çalışılıyor
-
Aydınlatma süreksizlikleri ve ifade aralığı
- Yalnızca gri tonlu dokular destekleniyor
- Point light yok
- Bu teknik ancak özenli bir ön işleme olduğunda pratik hale geliyor
- Spooky Iluha'nın tekniğinde aydınlatma süreksizliği sorunu yok, ancak aynı sorunun ambient ve direkt ışığı birlikte koruyarak çözülüp çözülemeyeceği bilinmiyor
-
ROM ve önceki çalışmalar
1 yorum
Hacker News yorumları
N64’te gerçekçi grafikler görmek gerçekten etkileyici; bu demo bana PS2’deki "ICO"yu hatırlatıyor
Eskiden beri N64 grafik donanımını soyutlayıp modern temel şekiller, ışıklandırma, gölgelendirme ve bu demodaki gibi ışığı önceden bake eden araçlar sunan bir SDK yapılabilir mi diye merak ediyordum
N64, kendi nesline göre epey özgün bir donanıma sahip; ayrıntılar Copetti.org’da: https://www.copetti.org/writings/consoles/nintendo-64/
OpenGL kütüphanesi olmasaydı doğrusu biraz şaşırırdım
Ancak önemli bir not var: 1) bu sistemi CPU takılı bir grafik kartı gibi görmek gerekir ve 2) grafik sistemi doğrudan açığa çıkarılmış durumda
Grafik yongalarının yapısı eninde sonunda kirli ve birbiriyle uyumsuz bir karmaşaya dönüşmeye yatkın olduğundan, hızlandırıcı üreticileri genellikle referans belgelerini yayımlamak yerine OpenGL, DirectX, CUDA, Vulkan gibi ara API’ler sunmayı tercih eder
Böylece iç uygulamayı sürekli uyumsuz yapıda tutabilirler. Referans belgelerini yayımlamazsanız donanımda geriye dönük uyumluluğu korumanız da gerekmez; bunun avantajı yeni tasarımlar yapabilmektir, dezavantajı ise kimsenin onu doğrudan kullanmasının kolay olmamasıdır
Bu yüzden o nesil konsollardaki gibi doğrudan erişim hakkı verilince içgüdüsel olarak irkiliyor insan
Ek olarak OpenGL SGI’dan çıktı; Nvidia’yı da eski SGI mühendisleri kurdu
N64 grafik hilelerini anlatan bir yazının sonunda "Is this the future?" sorusuyla bitmesini sevdim
On kadar popüler oyun okunabilir kaynak dosyalarına decompile edildi [1]; böylece emülatörsüz PC portları kolaylaştı ve özgün donanımda çalışan sayısız mod mümkün oldu
Birkaç Zelda fan remake’i de var [2]; yeni zindanları ve hikâyeleri olan tamamlanmış oyunlar da mevcut
Mario 64 tarafı özellikle hareketli; Kaze oyunu derinlemesine optimize etti [3] ve kendi motorunu ve devam oyununu da yapıyor. Retro teknoloji derin analizlerini seviyorsanız kanalı gerçekten bir hazine
Portal gibi akıl almaz demolar da çıkıyor [4] ve ne yazık ki Valve’ın hukuk ekibinin ilgisini çekti
Rare’in Dinosaur Planet’i gibi kayıp oyunlar da sızdırıldıktan sonra neredeyse yayımlanabilir duruma kadar cilalanıyor, decompile ediliyor ve kendine özgü bir indie canlanma yaşıyor [5]
[1] https://wiki.deco.mp/index.php/N64
[2] https://m.youtube.com/watch?v=bZl8xKDUryI
[3] https://m.youtube.com/channel/UCuvSqzfO_LV_QzHdmEj84SQ
Kanalın tamamı harika ve bunun gibi onlarca derin analiz var: https://m.youtube.com/watch?v=DdXLpoNLywg
Oyunu ve motoru da çok güzel: https://youtu.be/Drame-4ufso
[4] https://m.youtube.com/watch?v=yXzoZ2AfWwg
[5] https://m.youtube.com/watch?v=s0QSiPRmWaI
Bu oyun mühendislerinin ne kadar dâhi olduğunu her gördüğümde şaşırıyorum
Muazzam kısıtlar içinde hayal gücü yüksek ve mükemmel çözümler üretmişler
pico8, Animal Well ve sayısız şaşırtıcı oyunun sırrı tam da bu
Keşke bu hafta sonu 2D piksel art oyun yapımı yapım aracım için çok daha iyi bir mimari aklıma gelmeseydi. Şimdi çıkışa yine en az bir ay daha var gibi :(
Artık daha hızlı sistemlerimiz olması gerçekten güzel, ama eski oyunlarda kısıtları aşmaya çalışmanın ayrı bir eğlencesi vardı ve doğru yaptığınızda verdiği tatmin çok büyüktü
HN okurları raster interrupt’lara (https://en.wikipedia.org/wiki/Raster_interrupt) ve beam racinge aşinadır. Ben şahsen bunu Atari 800 ile ilişkilendirerek düşünürdüm
Normalde https://youtu.be/GuHqw_3A-vo?t=33 gibi şeyler yapabilmeniz gerekmezdi, ama Display List Interrupts sayesinde mümkün oldu
Yakın zamana kadar bilmediğim şey, Atari 2600 oyunlarının bu tür bir çılgınlığa ne kadar çok yaslandığıydı: https://www.youtube.com/watch?v=sJFnWZH5FXc
Böyle şeyleri görünce, donanım gelişimi dursa bile onlarca yıl boyunca daha ilginç şeyler bulmaya devam edebileceğimizi düşünüyorum
Demoscene ve bu tür işler etkileyici, ama genel olarak daha basit ve boş sahnelere kayma eğiliminde görünüyor
Bir oyun arka planına ya da oyun mekaniğinin bir parçası olarak girebilecek şeylere daha yakın. Çoğu teknikte, eksiksiz bir deneyim yaratmaya yetecek kaynak yokmuş gibi hissettiriyor
Daha etkileyici olan, FastDoom ya da çeşitli Mario 64 optimizasyon projeleri gibi eski donanımdan çok daha iyi performans sıkıp çıkaran işler
Bazen bunu içerik ve özellik eklerken de yapıyorlar. Demoscene geliştiricileriyle bu daha kapsamlı işler arasında bir bağlantı var mı diye de merak ediyorum
90'ların shareware oyunlarında benzer palet tabanlı aydınlatma teknikleri kullanılırdı
Temelde VGA 256 renk paletini oluştururken, desteklenen her renk için o rengin N kademeli parlaklık gradyanı yerleştirilirdi
Böylece yalnızca renk indeksini artırıp azaltarak her rengin parlaklığı kolayca değiştirilebilirdi
PS1 ve PS2 dönemindeki optimizasyonu özlüyorum
Çoğu, emülasyonla 1080p ya da 4K ve üstüne çıkarıldığında gerçekten harika görünüyor. Şahsen Halo 2 dönemi grafikleri 4K'da görmek bana yeterli geliyor
Elbette Halo 2 bir Xbox oyunu, ama Halo MCC'de Halo 2'yi klasik grafiklerle oynayınca hâlâ şaşırtıcı görünüyor
GT3'ün sıcak hava dalgalanması efekti bunu iyi özetliyor
"GT3 demosunda Seattle pistini gün batımında göstermişlerdi; yerden sıcaklık yükseliyor ve görüntü dalgalanıyordu. PS3'te o sıcak hava dalgalanması efektini yeniden üretemezsiniz. Çünkü read-modify-write, PS2 kullandığımız zamanki kadar hızlı değil. Böyle şeyler var."
https://old.reddit.com/r/ps2/comments/1cktw88/gran_turismos_...
https://youtu.be/ybi9SdroCTA?t=4103
UE5 gibi yeni motorlarda olduğu gibi gerçek sıcak hava dalgasını emüle etmeye çalışmak değil; kare hızını mahvetmemek için bir hileyle çözülmüş. Açıkçası RTX'in kare hızını ciddi biçimde düşürdüğünü görünce bu tür ucuz hileleri daha çok seviyorum
299MHz MIPS bunları çalıştırıyor
Shadow of the Colossus: https://www.youtube.com/watch?v=xMKtYM8AzC8
GoW2: https://youtu.be/IpKLwIIdvuk?si=TjifKmlYsUuvhk0F&t=970
FFXII: https://youtu.be/NytHoYOs_4M?si=jE1Fxy40khEvV6Bn&t=51
GT4: https://www.youtube.com/watch?v=F6lZIxk_h9g (açılış ekranını görünce duygulandım)
Black, Renderware çılgın bir motordu: https://youtu.be/bZBjcwyq7fQ?si=Pev5ifpksJm4X6Oi&t=356
Valkyrie Profile 2: https://youtu.be/9ScjO4NuUtA?si=Z29cR-hLsT2pnP2I&t=38
Rouge Galaxy: https://youtu.be/iR1evzyl-7Q?si=fldm3-NnuFxOITMn&t=624
Burnout 3: https://www.youtube.com/watch?v=_r5r0nE1sA4
Jak and Daxter, Ratchet da var
GC tarafında RE4, Metroid, Zelda'lar vb. zaten doğal olarak inanılmaz iyi görünüyor
Diz çöktürüyor
Pentium 90, neredeyse 100 civarıyla kapışabilirdi; ama 3DFX takılı bir MMX Pentium, PSX'i ezer ve N64'le aynı ya da ondan daha iyi olurdu
MIPS CPU harikaydı; düşük saat hızlarında bile şaşırtıcı işler çıkarıyordu. PSP'ye ya da SGI Irix'e bakmak yeterli
Ayrıca PS2'nin "GPU"su R4k CPU ile aynı şey değil
Ek olarak PS2'nin Deus Ex portu, PC sürümüne kıyasla berbattı ve Unreal motorunu tam olarak kaldıramıyordu
PS2'nin çılgın efektler ürettiği doğru, ama o portta seviyeler gerçekten küçüktü. Deus Ex'te oyunun büyük bir bölümünün neredeyse açık dünya olduğunu da hesaba katmak gerekiyor
Blur, bloom, çim ve bitki örtüsünde pop-in gibi şeyler aslında iyi görünmüyor; hepsini kapatmaktan bile daha kötü görünüyor
Hızlı tempolu bir birinci şahıs nişancı oyununda yüksek poligonlu modelleri seyredecek vakit de yok; bunun ne anlamı var, bilmiyorum
Benim gözüme Halo 3'ün doku çözünürlüğü yeterli. Doku boyutu 2 ya da 4 katına çıksa fark edeceğimi sanmıyorum; göze çarpan tek şey donanım gereksinimleri olur
GoW2 videosu PCSX2 üzerinde yakalanmış ve o klipte muhtemelen upscaling ile başka kolaylık özelliklerinden yararlanılmış
Diğer videoların hepsini izlemedim, ama her hâlükârda GoW2'nin PS2'de başardığı şey çok büyüktü