1 poin oleh GN⁺ 2026-02-09 | 1 komentar | Bagikan ke WhatsApp
  • Ini adalah proyek yang mengimplementasikan shading 3D real-time di Game Boy Color, di mana pemain dapat mengendalikan lintasan cahaya sambil memutar objek
  • Berdasarkan perhitungan vektor ternormalisasi dan shading Lambert (dot product), operasi disederhanakan dengan menggunakan sistem koordinat bola
  • Untuk mengatasi keterbatasan CPU SM83 yang tidak memiliki instruksi perkalian, proyek ini memanfaatkan transformasi logaritmik dan lookup table untuk melakukan komputasi dengan presisi 8-bit
  • Dengan menggunakan self-modifying code, proyek ini mencapai peningkatan performa sekitar 10% dan merender 15 tile per frame
  • Pembuatan kode dengan bantuan AI sebagian besar gagal, dan algoritme inti serta shader diselesaikan dengan kode buatan tangan yang ditulis langsung

Gambaran proyek

  • Membuat game yang merender gambar secara real-time di Game Boy Color
    • Pemain mengendalikan cahaya berbentuk orbit sambil memutar objek
  • Seluruh kode dipublikasikan di repositori GitHub (nukep/gbshader)

Proses pembuatan 3D

  • Menggunakan Blender untuk mengembangkan lookdev awal, lalu proyek dilanjutkan karena hasil visualnya memuaskan
  • Menggunakan Cryptomatte dan shader kustom untuk membuat normal map
    • Untuk model teapot, kamera diputar dan normal map diekspor sebagai urutan PNG
    • Bagian layar pada model Game Boy Color dirender di scene terpisah lalu dikomposisikan

Dasar matematis

  • Normal map digunakan sebagai medan vektor yang mengodekan vektor normal tiap piksel
  • Shading Lambert dihitung sebagai dot product dalam bentuk v = N·L
  • Dengan mengubahnya ke koordinat bola, persamaan disederhanakan menjadi v = sinNθ sinLθ cos(Nφ−Lφ) + cosNθ cosLθ
    • Semua vektor diasumsikan memiliki jari-jari r=1 untuk mengurangi jumlah komputasi

Implementasi di Game Boy

  • Lθ (sudut vertikal cahaya) dipatok sebagai konstanta, dan hanya Lφ (sudut rotasi cahaya) yang dikendalikan pemain
  • Di ROM, setiap piksel disimpan dalam bentuk (Nφ, log(m), b)
  • Untuk mengatasi ketiadaan instruksi perkalian, digunakan transformasi logaritmik dan lookup table (log, pow)
    • Bit tanda disimpan di bit paling atas untuk mendukung operasi bilangan negatif
  • Semua nilai skalar direpresentasikan sebagai pecahan 8-bit dalam rentang -1.0 hingga +1.0
    • Penjumlahan dilakukan di ruang linear, sedangkan perkalian dilakukan di ruang logaritmik
    • Nilai 127 digunakan sebagai penyebut agar ±1 keduanya bisa direpresentasikan

cos_log dan operasi inti

  • cos_log adalah lookup gabungan berbentuk log(cos x) yang menggantikan perkalian dengan penjumlahan logaritmik
  • Jumlah operasi per piksel
    • 1 pengurangan, 1 lookup cos_log, 1 penjumlahan, 1 lookup pow, 1 penjumlahan
    • Total 3 operasi tambah/kurang dan 2 lookup

Performa

  • Memproses 15 tile per frame, dan beberapa baris kosong dapat dihitung lebih cepat
  • Sekitar 130 siklus per piksel, sedangkan baris kosong hanya memerlukan 3 siklus
  • Sekitar 89% CPU digunakan untuk komputasi shader, sisanya untuk input dan pemrosesan I/O

Self-Modifying Code

  • Untuk mengoptimalkan loop inti yang memproses sekitar 960 piksel per frame, proyek ini memodifikasi instruksinya sendiri
    • Konstanta disisipkan langsung ke dalam kode agar lebih cepat dibanding memuat variabel
    • Contoh: sub a, 8 lebih cepat 12 siklus daripada sub a, variable
    • Secara keseluruhan menghemat sekitar 11.520 siklus (10%)

Upaya pemanfaatan AI

  • Sekitar 95% proyek ditulis secara manual
  • AI mengalami kesulitan dalam menulis assembly Game Boy (SM83)
  • Penggunaan AI
    • Python: membaca layer OpenEXR
    • Blender: skrip otomatisasi scene
    • SM83: beberapa snippet fungsi (misalnya VRAM DMA)
  • Upaya yang gagal
    • Mencoba menghasilkan kode assembly shader dengan AI → tidak efisien dan banyak kesalahan
  • Mencoba menggunakan model Claude Sonnet 4 untuk menghasilkan assembly dari pseudocode
    • Sebagian sempat bekerja, tetapi lambat dan mengandung kesalahan seperti mencampuradukkan Z80 dan SM83
    • Kode final akhirnya ditulis ulang sepenuhnya secara manual

Kesimpulan dan pelajaran

  • AI berguna untuk skrip sederhana, tetapi akurasi dan verifikasi itu wajib
  • Pada kode pemrosesan OpenEXR, AI menyebabkan kesalahan penyelarasan kanal (BGR vs RGB) yang memicu bug selama berminggu-minggu
  • Pengalaman ini menekankan pelajaran bahwa “hal terpenting saat menggunakan AI adalah verifikasi”
  • Proyek ini dinilai sebagai contoh implementasi shader eksperimental yang melampaui batasan hardware lawas

1 komentar

 
GN⁺ 2026-02-09
Komentar Hacker News
  • Senang melihat tulisan dengan nuansa hacker sejati di HN

    • Saya sempat penasaran apakah ini cuma dibuat dengan prompt AI. Saya ingin tahu bagaimana cara mengimplementasikannya 😉
  • Hasilnya benar-benar keren. Menurut pemahaman saya, ini adalah “shader yang terlihat seperti 3D, tetapi sebenarnya memberi efek pencahayaan pada normal map 2D yang sudah dirender sebelumnya”
    Frame-frame-nya ada di tautan GitHub ini

    • Pada dasarnya tidak jauh berbeda dari renderer “3D sungguhan”. Dalam pipeline deferred rendering pun shader berjalan di atas buffer 2D seperti depth map, normal map, dan color buffer.
      Bagian pemrosesan segitiga 3D dibuat tetap sederhana, lalu shader pencahayaan yang mahal hanya dijalankan sekali di atas gambar 2D sehingga efisien
      Dari sudut pandang shader, jika input-nya adalah vektor 3D maka itu adalah shader 3D. Apakah ada rasterizer 3D atau tidak adalah persoalan terpisah
      Game 3D modern juga memanfaatkan pendekatan seperti ini dalam berbagai bentuk. Teknik imposter yang memakai model prarender dari beberapa sudut pandang juga merupakan teknik yang dipakai di engine 3D resmi
    • Mirip dengan cara game Mac lama memberi pencahayaan pada tekstur 2D tanpa perangkat keras akselerasi 3D.
      Bedanya, kali ini itu berjalan di Game Boy Color, dan itulah yang mengejutkan
  • Halo, saya penulisnya. Saya dengar tulisan ini diposting di sini, jadi saya membuat akun. Terima kasih sudah membagikannya
    Saya juga sedang bereksperimen untuk menyederhanakannya lebih jauh dengan memakai environment map, dan bisa dilihat di tautan yang saya bagikan di Bsky

  • Proyek yang sangat menarik. Ini mengingatkan saya pada masa dulu saat menulis assembly C64.
    Waktu itu juga tidak ada instruksi perkalian, jadi kami harus mencari cara kreatif untuk mengakali keterbatasan perangkat keras

  • Ini awalnya adalah upaya untuk mencoba memakai AI, tetapi pada akhirnya menjadi eksperimen yang gagal.
    Industri sedang ramai membicarakan AI, jadi saya ingin mencobanya sendiri, dan saya merasa penting untuk secara transparan mengungkapkan apakah AI generatif digunakan.
    Jika disembunyikan, itu merusak kepercayaan; jika dibuka, kita bisa berdialog secara terbuka dengan orang-orang yang punya pandangan berbeda

    • Awalnya nadanya netral, tetapi orang-orang salah paham dan mengira saya memuji AI, jadi saya ubah menjadi agak skeptis.
      Saya hanya ingin mendokumentasikan proses ini
  • Shader GBC ini menunjukkan kebenaran bahwa “semua perhitungan adalah aproksimasi di bawah keterbatasan”.
    Perkalian diganti dengan lookup table dan penjumlahan, sementara presisi disesuaikan dengan hasil yang terlihat oleh mata

  • Benar-benar mengagumkan. Terutama karena ini berjalan di perangkat keras Game Boy Color yang asli.
    Sering kali ada kasus menaruh prosesor kuat di kartrid lalu memakai GBC hanya sebagai terminal sederhana, tetapi ini bukan hack seperti itu

  • Sejujurnya saya berharap Nintendo merilis ulang GBC atau GBA.
    Kalau dijual dalam bentuk kartrid dengan beberapa game bawaan, saya akan langsung membelinya

    • Unit bekas masih bisa didapat dengan harga cukup murah. Tinggal tambah flash cartridge dan selesai.
      Meski begitu, belakangan ini perangkat genggam Android dengan form factor yang sama terasa lebih praktis.
      Saya juga punya koleksi Game Boy, tetapi sekarang emulator jauh lebih nyaman
    • Tinggal beli ModRetro Chromatic buatan pendiri Oculus VR.
      Bahkan kalau Nintendo membuat yang baru, rasanya tidak akan sebagus itu
  • Tulisan seperti inilah alasan HN ada.
    Ini menghidupkan lagi kesenangan saat dulu membolak-balik majalah teknologi

  • Penulis ini adalah jenius sinting dalam arti yang baik