- 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
Komentar di Hacker News
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
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
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
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
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
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 dilewatiMakalah: https://dl.acm.org/doi/10.1145/360767.360802
Jika tetap mempertahankan bentuk fixed pipeline, fungsi menggambar yang cukup sederhana pun bisa memproses jumlah segitiga yang mengejutkan