3 poin oleh GN⁺ 2024-06-07 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-06-07
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.