Mempelajari pemrograman grafis lebih dari sekadar mempelajari API. Ini tentang mempelajari cara kerja grafik. Transformasi vertex, model pencahayaan, teknik bayangan, pemetaan tekstur, rendering yang ditangguhkan, dan sebagainya. Ini sama sekali tidak ada hubungannya dengan API yang Anda gunakan untuk mengimplementasikannya.
Jadi pertanyaannya adalah ini: apakah Anda ingin belajar cara menggunakan API? Atau Anda ingin belajar grafik ?
Untuk melakukan hal-hal dengan grafik akselerasi perangkat keras, Anda harus belajar cara menggunakan API untuk mengakses perangkat keras itu. Tetapi begitu Anda memiliki kemampuan untuk berinteraksi dengan sistem, pembelajaran grafik Anda berhenti berfokus pada apa yang dilakukan API untuk Anda dan sebaliknya berfokus pada konsep grafis. Pencahayaan, bayangan, pemetaan benjolan, dll.
Jika tujuan Anda adalah mempelajari konsep grafik, waktu yang Anda habiskan bersama API adalah waktu Anda tidak menghabiskan belajar konsep grafik . Cara mengompilasi shader tidak ada hubungannya dengan grafik. Tidak juga cara mengirim seragam, cara mengunggah data titik ke buffer, dll. Ini adalah alat, dan alat penting untuk melakukan pekerjaan grafis.
Tapi mereka sebenarnya bukan konsep grafis. Mereka adalah sarana untuk mencapai tujuan.
Dibutuhkan banyak pekerjaan dan pembelajaran dengan Vulkan sebelum Anda dapat mencapai titik di mana Anda siap untuk mulai belajar konsep grafis. Melewati data ke shader memerlukan manajemen memori eksplisit dan sinkronisasi akses secara eksplisit. Dan seterusnya.
Sebaliknya, mencapai titik itu dengan OpenGL membutuhkan lebih sedikit pekerjaan. Dan ya, saya sedang berbicara tentang OpenGL profil inti berbasis shader yang modern.
Bandingkan saja apa yang diperlukan untuk melakukan sesuatu yang sederhana seperti membersihkan layar. Dalam Vulkan, ini membutuhkan setidaknya beberapa pemahaman tentang sejumlah besar konsep: buffer perintah, antrian perangkat, objek memori, gambar, dan berbagai konstruksi WSI.
Dalam OpenGL ... itu tiga fungsi: glClearColor
, glClear
, dan platform-spesifik pertukaran buffer panggilan. Jika Anda menggunakan OpenGL yang lebih modern, Anda bisa mendapatkannya menjadi dua: glClearBufferuiv
dan menukar buffer. Anda tidak perlu tahu apa itu framebuffer atau dari mana gambar itu berasal. Anda menghapusnya dan menukar buffer.
Karena OpenGL menyembunyikan banyak hal dari Anda, dibutuhkan usaha yang jauh lebih sedikit untuk sampai ke titik di mana Anda sebenarnya belajar grafis daripada belajar antarmuka ke perangkat keras grafis.
Lebih jauh, OpenGL adalah (relatif) API yang aman. Ini akan mengeluarkan kesalahan ketika Anda melakukan sesuatu yang salah, biasanya. Vulkan tidak. Meskipun ada lapisan debugging yang dapat Anda gunakan untuk membantu, inti Vulkan API tidak akan memberi tahu Anda apa-apa kecuali ada kesalahan perangkat keras. Jika Anda melakukan kesalahan, Anda bisa mendapatkan rendering sampah atau merusak GPU.
Ditambah dengan kompleksitas Vulkan, menjadi sangat mudah untuk secara tidak sengaja melakukan hal yang salah. Lupa untuk mengatur tekstur ke tata letak yang tepat dapat bekerja di bawah satu implementasi, tetapi tidak yang lain. Melupakan titik sinkronisasi mungkin kadang-kadang berhasil, tetapi kemudian tiba-tiba gagal tanpa alasan. Dan seterusnya.
Semua yang dikatakan, ada lebih banyak belajar grafik daripada belajar teknik grafis. Ada satu area khusus di mana Vulkan menang.
Kinerja grafis .
Menjadi seorang programmer grafis 3D biasanya memerlukan beberapa ide tentang bagaimana mengoptimalkan kode Anda. Dan di sinilah OpenGL menyembunyikan informasi dan melakukan hal-hal di belakang Anda menjadi masalah.
Model memori OpenGL sinkron. Implementasi diizinkan untuk mengeluarkan perintah secara asinkron selama pengguna tidak dapat membedakannya. Jadi, jika Anda merender ke beberapa gambar, lalu mencoba membaca darinya, implementasinya harus mengeluarkan peristiwa sinkronisasi eksplisit antara dua tugas ini.
Tetapi untuk mencapai kinerja di OpenGL, Anda harus tahu bahwa implementasi melakukan ini, sehingga Anda dapat menghindarinya . Anda harus menyadari di mana implementasinya diam-diam mengeluarkan peristiwa sinkronisasi, dan kemudian menulis ulang kode Anda untuk menghindarinya sebanyak mungkin. Tetapi API itu sendiri tidak membuat ini jelas; Anda harus mendapatkan pengetahuan ini dari suatu tempat.
Dengan Vulkan ... Anda yang harus mengeluarkan acara sinkronisasi itu. Oleh karena itu, Anda harus menyadari fakta bahwa perangkat keras tidak menjalankan perintah secara serempak. Anda harus tahu kapan Anda perlu mengeluarkan acara-acara itu, dan karena itu Anda harus sadar bahwa mereka mungkin akan memperlambat program Anda. Jadi Anda melakukan semua yang Anda bisa untuk menghindarinya.
API eksplisit seperti Vulkan memaksa Anda untuk membuat keputusan kinerja semacam ini. Dan karena itu, jika Anda mempelajari Vulkan API, Anda sudah memiliki ide bagus tentang hal-hal apa yang akan lambat dan hal-hal apa yang akan cepat.
Jika Anda harus melakukan pekerjaan framebuffer yang memaksa Anda untuk membuat renderpass baru ... kemungkinannya bagus bahwa ini akan lebih lambat daripada jika Anda bisa memasangnya menjadi subpass terpisah dari renderpass. Itu tidak berarti Anda tidak dapat melakukan itu, tetapi API memberi tahu Anda di muka bahwa itu dapat menyebabkan masalah kinerja.
Di OpenGL, API pada dasarnya mengundang Anda untuk mengubah lampiran framebuffer Anda mau tak mau. Tidak ada panduan untuk perubahan mana yang cepat atau lambat.
Jadi dalam hal itu, belajar Vulkan dapat membantu Anda belajar lebih baik tentang cara membuat grafik lebih cepat. Dan itu pasti akan membantu Anda mengurangi overhead CPU.
Masih perlu waktu lebih lama sebelum Anda bisa sampai pada titik di mana Anda dapat mempelajari teknik rendering grafis.