- Demo Nintendo 64 untuk Revision 2025 menghasilkan efek yang mendekati normal mapping, pencahayaan baked, dan specular real-time dengan hanya memperbarui palet, tanpa menghitung ulang seluruh tekstur
- Saat CPU membaca normal dan warna diffuse pada tiap indeks palet untuk membuat palet RGB baru, tekstur berpalet bereaksi seolah-olah menerima pencahayaan per texel
- Tekstur diffuse dan normal map berbagi indeks palet yang sama, dan dibuat dengan K-means clustering dari scikit-learn seolah-olah digabung sebagai gambar 6-kanal
- Pencahayaan bangunan menggabungkan warna ambient pada RGB vertex, visibilitas matahari pada alpha vertex, irradiance map abu-abu, dan
dot(N, sun_dir) dari cahaya matahari terarah
- Efektif untuk cahaya diffuse terarah, tetapi punya banyak batasan pada bayangan, point light, specular yang akurat, dan model besar dengan tekstur berulang, sehingga keterbatasannya harus disamarkan lewat prapemrosesan
Shading dengan Hanya Memperbarui Palet
- Demo Nintendo 64 ini dibuat untuk Revision 2025 dan menggunakan efek yang mendekati pencahayaan baked, normal mapping, serta specular shading real-time
- Normal mapping di N64 sudah diketahui memungkinkan lewat eksperimen homebrew sebelumnya, dan demo ini memilih menghitung palet hasil pencahayaan saat runtime, bukan teksturnya
- Tanpa dukungan hardware khusus, CPU dapat menjalankan kode shading arbitrer, tetapi kecepatan komputasinya lambat
- Pada tekstur berpalet, dengan mengubah palet saja, bukan seluruh texel, seluruh tekstur dapat terlihat seolah-olah sudah menerima perhitungan pencahayaan
- Palet asli diganti dengan palet yang sudah diberi shading
- Tekstur berpalet diterapkan ke objek seperti tekstur biasa
- Bahkan hanya dengan cahaya diffuse sederhana
dot(N,L), hasilnya terlihat cukup bagus
- Contoh awal mengembalikan koreksi gamma pada tekstur warna dan melakukan shading di ruang linear, tetapi pada demo akhir ini tidak bisa diterapkan karena komponen ambient dan direct light harus dipisah lalu dikomposisikan lewat hardware pada unit RDP N64
Normal Mapping di Ruang Objek
- Normal mapping pada umumnya dilakukan di ruang tangen
- Tekstur berulang dapat digunakan
- Normal detail dapat mengoreksi normal vertex yang berubah halus
- Normal map ruang tangen dengan satu warna merepresentasikan permukaan yang mulus
- Normal ruang objek lebih sederhana dihitung, tetapi memiliki batasan besar
- Texel pada normal map merepresentasikan normal permukaan absolut, bukan deviasi dari normal vertex
- Perhitungan runtime menjadi sesederhana membaca warna dari tekstur
- Setiap titik permukaan membutuhkan texel unik seperti lightmap
Palet yang Dibagi oleh Tekstur Diffuse dan Normal Map
- Objek memiliki tekstur diffuse
basecolor * ao dan normal map
- Kedua tekstur berbagi indeks palet yang sama, dan indeks ini dibuat dengan K-means clustering dari scikit-learn
- Gambar-gambar tersebut ditafsirkan seperti satu gambar 6-kanal
- Dengan satu indeks, normal dan warna diffuse permukaan dapat diambil sekaligus
- Saat loading atau pada setiap frame, warna palet diiterasi
- Kode shader CPU membuat warna RGB baru untuk tiap indeks
- Hasil loop menjadi palet baru yang sudah diberi pencahayaan
- Pendekatan ini dalam praktiknya paling cocok untuk pencahayaan terarah
- Efek seperti bayangan sulit diekspresikan hanya dengan palet, sehingga harus digabungkan dengan pencahayaan baked
Ambient Terarah dan Cahaya Matahari yang Dibaked
- Untuk membuat pencahayaan bangunan dalam demo lebih realistis, ambient dan cahaya matahari langsung disimpan terpisah pada warna vertex
- RGB vertex: warna ambient
- Alpha vertex: visibilitas matahari
- Komponen ambient dibagi menjadi intensitas terarah dan warna
- Intensitas terarah adalah irradiance map grayscale
- Warnanya adalah RGB vertex dengan saturasi ditingkatkan
- Matahari adalah pencahayaan terarah, dan visibilitasnya dikirim melalui alpha vertex
- Rumus shading-nya adalah sebagai berikut
ambient = vertex_rgb * grey_irradiance_map(N)
direct = vertex_alpha * sun_color * dot(N, sun_dir)
color = diffuse_texture * (ambient + direct)
- Warna vertex untuk visibilitas matahari yang berantakan dimasking oleh perhitungan
N.L, sehingga terefleksi dengan lebih rapi pada hasil direct light akhir
- Ambient terarah dapat terlihat mewah berkat detail tekstur, meskipun pencahayaan baked-nya kasar
- Untuk environment map yang buram, digunakan equirectangular projection karena kesederhanaannya
- HDRI Polyhaven sudah menggunakan proyeksi ini
- Karena shading dihitung terlebih dahulu saat loading, matematika sampling yang rumit tidak menjadi masalah
Menangani Model Besar dengan Tekstur Berulang
- Algoritme shading aslinya dirancang untuk satu objek, dan awalnya hanya diuji dengan
potato_rock.obj
- Mesh benteng pada demo memiliki tekstur berulang, sehingga menimbulkan masalah
- Solusinya adalah membagi mesh besar menjadi beberapa submesh, lalu membuat setiap submesh secara konseptual berbagi normal map ruang objek yang sama
- Di Blender, geometri dikelompokkan secara manual berdasarkan material dan arah permukaan
- Matriks world-to-model dihitung berdasarkan normal poligon tiap grup
- Matriks ini kira-kira mendekati ruang tangen
- Karena setiap grup berbagi palet, keseluruhan pencahayaan hanya benar dalam arti rata-rata
- Ruang tangen tidak diinterpolasi saat runtime, sehingga terlihat seperti pencahayaan per bidang, dan ini adalah salah satu kelemahan terbesar teknik tersebut
Aproksimasi Specular Shading
- Karena banyak titik permukaan berbagi warna shading yang sama, point light atau specular shading sulit dihitung secara akurat
- Pendekatan ruang palet cocok untuk pencahayaan diffuse terarah yang tidak membutuhkan vektor
to camera V
- Efek specular dicoba dengan mengaproksimasi objek sebagai bola
- Titik yang akan dishading
p ditetapkan sebagai p = radius * normal
- Karena banyak titik permukaan berbagi indeks palet yang sama, hasilnya pasti terlihat bersudut
- Specular highlight pada demo terlihat agak aneh, tetapi cukup berfungsi untuk menipu kebanyakan orang
Batasan dan Materi Terkait
- Dalam demo, batasan utama dicoba disembunyikan lewat prapemrosesan dan penyusunan adegan
-
Diskontinuitas Pencahayaan dan Rentang Ekspresi
- Hanya tekstur grayscale yang didukung
- Tidak ada point light
- Teknik ini praktis hanya jika ada prapemrosesan yang cermat
- Teknik Spooky Iluha tidak memiliki masalah diskontinuitas pencahayaan, tetapi belum diketahui apakah masalah yang sama dapat diselesaikan sambil tetap mempertahankan ambient dan direct light
-
ROM dan Riset Sebelumnya
1 komentar
Komentar Hacker News
Melihat grafik yang realistis di N64 benar-benar mengesankan, dan demo ini mengingatkan pada "ICO" di PS2
Sejak dulu saya penasaran apakah mungkin membuat SDK yang mengabstraksikan hardware grafis N64 untuk menyediakan primitif modern, pencahayaan, shading, serta alat seperti demo ini yang melakukan pra-pemanggangan pencahayaan
N64 punya hardware yang cukup unik untuk generasinya, dan detailnya ada di Copetti.org: https://www.copetti.org/writings/consoles/nintendo-64/
Saya malah akan agak terkejut kalau tidak ada library OpenGL
Namun ada catatan besar: 1) sistem ini harus dipandang seperti kartu grafis yang ditempeli CPU, dan 2) sistem grafisnya diekspos secara langsung
Struktur chip grafis pada akhirnya mudah menjadi kekacauan yang kotor dan saling tidak kompatibel, jadi produsen akselerator biasanya lebih memilih membuka API perantara seperti OpenGL, DirectX, CUDA, atau Vulkan daripada merilis dokumentasi referensi
Dengan begitu, implementasi internal bisa terus dipertahankan dalam struktur yang tidak kompatibel. Jika dokumentasi referensi tidak dibuka, mereka juga tidak perlu menjaga kompatibilitas mundur hardware; kelebihannya adalah bisa membuat desain baru, tetapi kekurangannya adalah hampir tidak ada yang bisa memakainya secara langsung
Jadi ketika mendapat akses langsung seperti pada konsol generasi itu, reaksi naluriahnya adalah ngeri
Tambahan lagi, OpenGL berasal dari SGI, dan Nvidia juga didirikan oleh mantan insinyur SGI
Saya suka bahwa tulisan tentang trik grafis N64 ini berakhir dengan pertanyaan "Is this the future?"
Belasan judul populer telah didekompilasi menjadi file sumber yang bisa dibaca [1], sehingga port ke PC tanpa emulator menjadi lebih mudah dan banyak mod yang berjalan di hardware asli juga jadi mungkin
Ada juga beberapa remake penggemar Zelda [2], serta game lengkap dengan dungeon dan cerita baru
Sisi Mario 64 khususnya sangat panas; Kaze telah mengoptimalkan gamenya secara mendalam [3] dan juga sedang membuat engine serta sekuelnya sendiri. Kalau suka analisis mendalam teknologi retro, kanalnya benar-benar tambang emas
Demo yang absurd seperti Portal juga bermunculan [4], meski sayangnya menarik perhatian tim hukum Valve
Game hilang seperti Dinosaur Planet dari Rare juga, setelah bocor, dipoles hingga hampir layak rilis, didekompilasi, dan mengalami kebangkitan indie tersendiri [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
Seluruh kanalnya bagus, dan ada puluhan analisis mendalam seperti ini: https://m.youtube.com/watch?v=DdXLpoNLywg
Game dan engine miliknya juga indah: https://youtu.be/Drame-4ufso
[4] https://m.youtube.com/watch?v=yXzoZ2AfWwg
[5] https://m.youtube.com/watch?v=s0QSiPRmWaI
Setiap kali melihat betapa jeniusnya para engineer game ini, saya selalu takjub
Mereka menciptakan solusi yang imajinatif dan hebat di tengah keterbatasan yang luar biasa
Itulah rahasia pico8, Animal Well, dan begitu banyak game menakjubkan lainnya
Andai saja akhir pekan ini saya tidak terpikir struktur yang jauh lebih baik untuk alat pembuat game pixel art 2D saya. Sekarang sepertinya rilisnya mundur sebulan lagi :(
Sekarang memang menyenangkan karena ada sistem yang lebih cepat, tetapi dulu ada keseruan tersendiri saat harus mengakali keterbatasan di game lama, dan kepuasannya sangat besar ketika berhasil melakukannya dengan benar
Pembaca HN mungkin sudah akrab dengan raster interrupt (https://en.wikipedia.org/wiki/Raster_interrupt) dan beam racing. Secara pribadi saya selalu mengaitkannya dengan Atari 800
Semestinya hal seperti https://youtu.be/GuHqw_3A-vo?t=33 tidak bisa dilakukan, tetapi Display List Interrupts membuatnya mungkin
Yang baru saya sadari belakangan adalah betapa banyak game Atari 2600 bergantung pada kegilaan seperti ini: https://www.youtube.com/watch?v=sJFnWZH5FXc
Melihat hal semacam ini membuat saya berpikir bahwa meski perkembangan hardware berhenti, kita masih bisa terus menemukan hal-hal yang lebih menarik selama puluhan tahun
Demoscene dan pekerjaan seperti ini memang mengesankan, tetapi secara umum tampaknya cenderung mengarah ke adegan yang lebih sederhana dan kosong
Lebih mirip sesuatu yang bisa masuk sebagai latar game atau bagian dari mekanisme game. Dengan sebagian besar tekniknya, rasanya sumber daya yang tersedia tidak cukup untuk membuat pengalaman yang utuh
Yang lebih mengesankan adalah pekerjaan seperti FastDoom atau berbagai proyek optimisasi Mario 64 yang memeras performa jauh lebih baik dari hardware lama
Kadang mereka melakukannya sambil tetap menambahkan konten dan fitur. Saya juga penasaran apakah ada titik temu antara developer demoscene dan pekerjaan yang lebih menyeluruh seperti ini
Game shareware era 90-an memakai teknik pencahayaan berbasis palet yang mirip
Pada dasarnya, saat menyusun palet VGA 256 warna, untuk setiap warna yang didukung mereka memasukkan gradasi kecerahan N tingkat dari warna tersebut
Dengan begitu, kecerahan tiap warna bisa diubah dengan mudah hanya dengan menambah atau mengurangi indeks warna
Saya merindukan optimisasi pada era PS1 dan PS2
Kebanyakan terlihat sangat keren kalau dinaikkan lewat emulasi ke 1080p atau 4K ke atas. Secara pribadi, menurut saya grafis setingkat era Halo 2 dalam 4K sudah cukup
Tentu saja Halo 2 adalah game Xbox, tetapi kalau memainkan Halo 2 di Halo MCC dengan grafis klasik, sampai sekarang masih terlihat menakjubkan
Efek fatamorgana panas di GT3 merangkumnya dengan baik
"Di demo GT3, mereka menampilkan lintasan Seattle saat senja, dan ada adegan panas naik dari permukaan tanah hingga beriak. Di PS3, efek fatamorgana panas itu tidak bisa direproduksi. Sebab read-modify-write tidak secepat saat memakai PS2. Ada hal-hal seperti itu."
https://old.reddit.com/r/ps2/comments/1cktw88/gran_turismos_...
https://youtu.be/ybi9SdroCTA?t=4103
Itu bukan mencoba mengemulasi gelombang panas sungguhan seperti engine baru semacam UE5, melainkan menanganinya dengan trik agar frame rate tidak hancur. Jujur saja, melihat RTX memangkas frame rate cukup besar, saya lebih suka trik murah seperti ini
MIPS 299MHz menjalankan hal seperti ini
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 (melihat layar boot membuat saya terharu)
Black, Renderware adalah engine yang gila: 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
Ada juga Jak and Daxter, Ratchet
Di sisi GC, RE4, Metroid, Zelda, dan lainnya tentu saja terlihat luar biasa bagus
Membuat saya bertekuk lutut
Mungkin bisa bersaing dengan Pentium 90, nyaris 100, tetapi MMX Pentium dengan 3DFX akan mengungguli PSX dan setara atau lebih baik daripada N64
CPU MIPS itu hebat, mampu melakukan hal-hal mengejutkan bahkan pada clock rendah. Lihat saja PSP atau SGI Irix
Selain itu, "GPU" PS2 tidak sama dengan CPU R4k
Sebagai tambahan, port Deus Ex untuk PS2 sangat buruk dibandingkan versi PC dan tidak sepenuhnya sanggup menangani engine Unreal
Memang benar PS2 menghasilkan efek-efek gila, tetapi di port itu levelnya benar-benar kecil. Perlu juga mempertimbangkan bahwa bagian besar Deus Ex hampir mendekati open world
Blur, bloom, pop-in rumput dan vegetasi sebenarnya tidak terlihat bagus, malah terlihat lebih buruk daripada mematikan semuanya
Dalam first-person shooter bertempo cepat, tidak ada waktu untuk mengagumi model berpoligon tinggi, jadi saya juga tidak tahu apa gunanya
Di mata saya, resolusi tekstur Halo 3 sudah cukup. Kalau ukuran teksturnya jadi 2x atau 4x pun saya rasa saya tidak akan menyadarinya; yang terlihat hanya kebutuhan hardware-nya
Video GoW2 itu diambil dari PCSX2, dan dalam klip itu kemungkinan mendapat manfaat dari upscaling serta fitur kenyamanan lain
Saya belum menonton semua video lainnya, tetapi bagaimanapun pencapaian GoW2 di PS2 memang luar biasa