Daftar isi
- Pengantar
- Mempelajari pemrograman grafis
- Jangan terobsesi pada masalah sepele
- Mengapa Vulkan?
- Mempelajari Vulkan
- Gambaran umum mesin dan analisis frame
- Saran umum
- Pustaka Vulkan yang direkomendasikan
- Abstraksi GfxDevice
- Penanganan shader
- Push constant, descriptor set, dan bindless descriptor
- Pola pipeline
- Menggunakan Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
- Bindless descriptor
- Menangani data dinamis yang harus diunggah setiap frame
- Destructor, deletion queue, dan pembersihan
- Sinkronisasi
- Catatan implementasi tambahan
- Menggambar banyak sprite
- Compute skinning
- Pemisahan game / renderer
- Pemuatan scene dan prefab entitas
- MSAA
- UI
- Dear ImGui dan masalah sRGB
- Hal lainnya
- Hal yang diperoleh saat beralih ke Vulkan
- Pekerjaan selanjutnya
Pengantar
- Ini adalah dokumentasi pengalaman mempelajari Vulkan dan menulis mesin game kecil.
- Dikerjakan selama 3 bulan tanpa pengetahuan awal tentang Vulkan.
- Membuat game 3D kecil dan memisahkan bagian yang dapat digunakan ulang menjadi mesin.
Mempelajari pemrograman grafis
- Bagi orang yang baru mulai belajar pemrograman grafis, sebaiknya mulai dari OpenGL.
- Melalui OpenGL, berguna untuk mempelajari cara menampilkan model bertekstur di layar serta pencahayaan sederhana dan shadow mapping.
- Sumber belajar OpenGL yang direkomendasikan:
- learnopengl.com
- Buku Anton’s OpenGL 4 Tutorials
- Kuliah Thorsten Thormählen (disarankan 6 video pertama)
Jangan terobsesi pada masalah sepele
- Perlu berhati-hati agar tidak terobsesi pada masalah sepele.
- Harus selalu bertanya pada diri sendiri, "Apakah ini benar-benar perlu?", "Apakah ini akan menjadi bottleneck?"
- Fitur yang tidak diperlukan bisa ditambahkan nanti.
- Sebaiknya mulai dari game yang sederhana, dan berhati-hati agar tidak membuat mesin yang terlalu kompleks.
Mengapa Vulkan?
- Vulkan cocok bagi mereka yang ingin menggunakan fitur GPU modern dan lebih menyukai teknologi serta standar open source.
- OpenGL cukup untuk game kecil, tetapi sulit memanfaatkan fitur GPU modern, dan penggunaannya terbatas di macOS.
- WebGPU lebih mudah dipelajari dibanding Vulkan dan dapat menjalankan game di browser.
Mempelajari Vulkan
- Mempelajari Vulkan awalnya tampak sulit, tetapi menjadi lebih mudah karena Khronos menyederhanakan bagian yang rumit dan menyediakan pustaka yang berguna.
- Sumber belajar Vulkan yang direkomendasikan:
- vkguide
- Seri kuliah Vulkan dari TU Wien
- Buku 3D Graphics Rendering Cookbook
- Buku Mastering Graphics Programming with Vulkan
Gambaran umum mesin dan analisis frame
- Nama mesinnya adalah EDBR (Elias Daler’s Bikeshed Engine), dan dimulai sebagai proyek belajar Vulkan.
- Mesin ini terutama cocok untuk game kecil berbasis level.
- Proses rendering frame:
- Skinning: memproses skinning model menggunakan compute shader
- Shadow mapping: menggunakan tekstur depth 4096x4096
- Geometri dan shading: menggunakan model PBR
- Penyelesaian depth: diproses secara manual melalui fragment shader
- Efek pascaproses: menerapkan depth fog, tone mapping, dan bloom
- UI: menggambar UI dengan satu draw call
Saran umum
Pustaka Vulkan yang direkomendasikan
- vk-bootstrap: menyederhanakan kode inisialisasi Vulkan
- Vulkan Memory Allocator (VMA): mengelola alokasi memori
- volk: menyederhanakan pemuatan fungsi ekstensi
Abstraksi GfxDevice
- Kelas
GfxDevice mengenkapsulasi fungsi Vulkan, menangani inisialisasi konteks Vulkan, pembuatan dan pengelolaan swapchain, dan sebagainya.
Penanganan shader
- Menulis shader menggunakan GLSL.
- Melakukan prakompilasi shader pada tahap build untuk mengurangi ketergantungan saat runtime.
Push constant, descriptor set, dan bindless descriptor
- Di Vulkan, descriptor set digunakan untuk mengirim data ke shader.
- Penggunaan descriptor set diminimalkan dengan bindless descriptor dan Buffer Device Address.
Pola pipeline
- Menggunakan kelas pipeline untuk memisahkan tahap-tahap drawing.
- Inisialisasi, pembersihan, dan drawing ditangani melalui metode
init, cleanup, dan draw.
Menggunakan Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
- Menyatukan tipe vertex menjadi satu dan mengakses vertex langsung dari shader.
- Alamat buffer dikirim menggunakan push constant.
Bindless descriptor
- Tekstur dikelola dengan pendekatan bindless agar bisa diakses langsung dari shader.
- Texture ID dikirim melalui push constant untuk sampling.
Pendapat GN⁺
- Vulkan menawarkan performa tinggi dan fitur GPU modern, tetapi kurva belajar awalnya curam.
- Sebaiknya pelajari OpenGL terlebih dahulu sebelum beralih ke Vulkan.
- Tersedia beragam sumber belajar untuk Vulkan, dan memanfaatkannya dapat mempermudah proses belajar.
- Menulis mesin game kecil dengan Vulkan membantu memahami pemrograman grafis secara lebih mendalam.
- Sebaiknya gunakan pustaka yang berguna untuk mengurangi kompleksitas Vulkan.
1 komentar
Opini Hacker News
Ringkasan komentar Hacker News
Efektivitas pendekatan minimalis: Sedang menulis klien metaverse dengan Rust, dan mengalami masalah kompleks saat menggunakan Vulkan, WGPU, dan Rend3. WGPU sulit dikembangkan karena berusaha mendukung berbagai platform.
Kelebihan Vulkan dan kemudahan OpenGL: Vulkan dapat memanfaatkan fitur GPU tingkat lanjut semaksimal mungkin, tetapi OpenGL cocok untuk game 2D/sedikit poligon yang sederhana. Industri game AAA berfokus pada kualitas grafis, tetapi banyak pemain lebih peduli pada gameplay.
Menerapkan hanya fitur yang diperlukan: Programmer junior cenderung terobsesi dengan alat terbaru dan "best practice", tetapi penting untuk fokus pada fitur minimum yang benar-benar dibutuhkan untuk menyelesaikan masalah nyata.
Kompleksitas Vulkan: Dibandingkan OpenGL, Vulkan lebih sulit dioptimalkan untuk performa dan membutuhkan banyak kode serta pekerjaan sinkronisasi. Untuk hobi, OpenGL ES3 lebih praktis.
Masalah lapisan abstraksi tambahan: Materi untuk mempelajari Vulkan sering memperkenalkan lapisan abstraksi tambahan sehingga sulit menemukan contoh dasar pengelolaan memori.
Sulitnya mempelajari Vulkan: OpenGL mudah dipelajari, tetapi Vulkan membuat pekerjaan sederhana pun menjadi rumit. Mempelajari teknologi baru membutuhkan banyak waktu.
Mempelajari Vulkan untuk visualisasi data ilmiah: Ada yang mempelajari Vulkan lalu menulis engine visualisasi data ilmiah, dan butuh waktu lama untuk memahami banyak abstraksi selama proses belajar.
Kesulitan belajar Vulkan: Sulit memahami cara menggunakan Vulkan dalam engine nyata. Dibutuhkan lebih banyak materi untuk mempelajari abstraksi yang baik dan cara menentukan urutan rendering.
Dukungan komunitas pemrograman grafis: Saat mengembangkan engine Vulkan, dukungan dan umpan balik dari komunitas sangat membantu.