2 poin oleh GN⁺ 2 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Untuk memahami cara kerja internal OpenGL·Vulkan·Metal·DirectX, software renderer diimplementasikan dari nol tanpa library grafis eksternal
  • Model 3D yang terdiri dari mesh segitiga dan tekstur diubah menjadi gambar, dan pembahasan tidak mencakup implementasi GUI atau aplikasi GPU
  • Kode akhirnya sekitar 500 baris, dan mahasiswa biasanya mulai membuat renderer yang berfungsi dengan menghabiskan 10~20 jam
  • Hanya diberikan kelas pemrosesan TGA yang mendukung RGB·RGBA·grayscale serta fungsi untuk mengatur satu piksel, sehingga menggambar garis dan segitiga harus diimplementasikan sendiri
  • Alih-alih menyalin kode jadi, menulisnya sendiri membantu memahami konsep rendering dan cara kerja internal library 3D

Proses membangun sendiri rendering pipeline

  • Mempelajari cara kerja rendering pipeline dengan mengikuti secara longgar struktur library grafis 3D modern
    • Alih-alih cara menulis aplikasi GPU, perilaku internal direproduksi dengan software renderer
    • Inputnya adalah model 3D yang terdiri dari mesh segitiga dan tekstur, dan outputnya adalah gambar hasil render
    • Program menghasilkan file gambar tanpa antarmuka grafis
  • Untuk mengurangi dependensi eksternal, digunakan format gambar sederhana TGA
    • Fungsi yang awalnya disediakan hanya memuat/menyimpan gambar dan mengatur warna satu piksel
    • Tidak ada fungsi bawaan untuk menggambar garis atau segitiga, jadi semuanya harus ditulis sendiri
  • Contoh awal membuat framebuffer RGB 64x64, mengatur piksel di tiga koordinat menjadi putih, lalu menyimpannya sebagai framebuffer.tga
    • Nilai warna ditentukan dalam urutan BGRA

Build dan menjalankan kode

git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
cmake -Bbuild &&
cmake --build build -j &&
build/tinyrenderer obj/diablo3_pose/diablo3_pose.obj obj/floor.obj
  • Hasil eksekusi disimpan di framebuffer.tga
  • Kode selesai memang hanya sekitar 500 baris, tetapi karena proses implementasi langsung sangat penting untuk memahami konsep, pendekatan memakai begitu saja kode yang disediakan tidak disarankan

1 komentar

 
GN⁺ 2 jam lalu
Komentar di Hacker News
  • Beberapa bulan lalu saya mengimplementasikan software renderer sendiri dengan Rust tanpa LLM, lalu menambahkan game sederhana serta shader piksel dan efek aberasi kromatik di tepi senter
    https://github.com/kshitijl/tinyrenderer-rs
    Repositorinya berisi banyak tangkapan layar tentang proses pengembangan dan bug visual yang lucu. Saya belajar banyak bukan hanya tentang prinsip rendering, tetapi juga bahwa CPU modern sangat cepat, dan bahkan renderer CPU single-thread pun bisa menjalankan game 3D interaktif dengan efek khusus yang meriah
    • Saya penasaran, kalau ini software renderer, mengapa bergantung pada wgpu
    • Saya penasaran apakah saat menulis logika game dengan Rust memang sampai perlu menambahkan ECS
  • Materi ini dan Mathematics for Computer Graphics karya John Vince sangat penting dalam membuat software renderer saya
    Itu sebelum era LLM, jadi butuh setidaknya dua bulan, dan sebagian besar waktunya dipakai untuk memahami matematika grafika komputer serta melacak segmentation fault di C
    • Saya penasaran selama beberapa bulan itu Anda mengerjakannya berapa jam per hari
  • Saya penasaran apakah buku Foley dan Van Dam masih menjadi rujukan utama di bidang ini. Buku itu direvisi pada 2013, tetapi saya lebih akrab dengan edisi 1982 yang berfokus pada 2D, dan saat itu buku tersebut seperti kitab standar grafika komputer
    • Sudah lama saya tidak membukanya lagi, dan bagi saya buku itu lebih mirip ensiklopedia unik yang bernilai historis
      Catatan kuliah di GitHub ini lebih baik untuk mengulang konsep. Saya tidak suka gaya kode di repositorinya dan rasterizer lawasnya juga terlalu sederhana serta tidak efisien, tetapi tetap menurut saya lebih enak dibaca daripada buku Foley
    • Saya juga belajar dari edisi ke-2 dan punya edisi terbaru 2013; menurut saya cukup lumayan
      Seiring pergantian edisi, bahasa yang digunakan juga berkembang dari Pascal ke C, lalu C dan C++, dan edisi terbaru juga memuat sedikit C#. Beberapa konsep baru memang tidak ada, tetapi menurut saya masih banyak isi yang bernilai
  • Saya berharap setidaknya ada satu tutorial software renderer yang membahas triangle clipping dengan benar. Untuk renderer praktis, ini wajib ditangani bahkan pada adegan dasar ketika geometri berpotongan dengan view frustum, tetapi bagi saya pribadi ini bagian tersulit
    • Topik ini dibahas dalam satu bab penuh: https://gabrielgambetta.com/computer-graphics-from-scratch/11-clipping.html
    • Triangle clipping hanya diperlukan ketika interpolasi atribut pada segitiga yang sangat besar itu penting, dan ada dua cara: membuang dengan cepat atau menyintesis primitive
      Frustum clipping bisa ditangani dengan pemilihan titik pada tile lokal, dan untuk sintesis primitive lebih mudah menangani persegi clipping yang sudah ditransformasi balik dalam sistem koordinat barycentric. Galat pembulatan bisa dikendalikan dengan double precision atau fixed-point, dan tantangan utamanya adalah meregenerasi nilai Z dan 1/Z untuk verteks baru. Jika rasterizer-nya melakukan sintesis atribut tertunda, sisanya akan mengalir alami melalui pipeline, dan contoh bisa dilihat pada implementasi open source di OpenSWR.org
    • Saya juga selalu tersendat pada tahap “harus mengimplementasikan clipping”, tetapi akhirnya berhasil membuat kode yang berjalan tanpa kesulitan besar, dan baru belakangan tahu bahwa saya telah menemukan ulang algoritma Sutherland–Hodgman secara independen
      Hambatan psikologis terbesar adalah asingnya ruang proyeksi dan koordinat homogen. Enam bidang di clip space sebenarnya sederhana: x = ±w, y = ±w, z = ±w. Cukup iterasi setiap sisi poligon, tentukan apakah kedua ujungnya berada di dalam atau di luar, lalu lakukan interpolasi linear untuk posisi titik potong batas dan atribut verteks. Jika proses ini diterapkan berurutan ke semua bidang, segitiga menjadi poligon cembung dengan maksimal 9 verteks dan mudah ditriangulasi kembali. Dengan menghitung outcode lebih dulu, clipping untuk segitiga yang sepenuhnya di dalam atau di luar bisa dilewati
      Makalah: https://dl.acm.org/doi/10.1145/360767.360802
  • Di lingkungan modern, pada dasarnya tidak ada yang namanya C++ murni. Kita tidak bisa menulis langsung ke register dan VRAM untuk mengeluarkan gambar seperti komputer tahun 1980-an; pada akhirnya kita bergantung pada banyak sekali kode di atas lapisan API, driver, dan firmware yang tebal
  • Karena nostalgia 1990-an, saya sedang mencoba lagi software rendering, dengan mencampurkan bank CLUT ala 2D dan teknik modern berupa segitiga yang diklasifikasikan per rentang serta koordinat barycentric
    Jika tetap mempertahankan bentuk fixed pipeline, fungsi menggambar yang cukup sederhana pun bisa memproses jumlah segitiga yang mengejutkan
  • Saya menemukan bug pemrosesan OpenMP di macOS dan mengirim PR pertama saya ke repositori ini setelah sangat lama