Gunakan buffer seragam (yaitu buffer konstan dalam istilah D3D).
Selama semua shader Anda menyetujui tata letak dan titik pengikatan masing-masing buffer kemudian memperbarui menjadi mudah. Model tidak perlu tahu apa-apa tentang shader sama sekali. Mereka hanya perlu memperbarui model-view matrix dalam buffer konstan dan pipeline rendering akan menggunakannya secara otomatis.
Paling tidak saya berpendapat Anda harus memiliki dua buffer seperti itu. Yang pertama harus menyimpan matriks proyeksi, matriks kamera, matriks proyeksi-kamera yang digabungkan, informasi viewport, detail frustrum, dan inverses matriks. Anda hanya perlu memperbarui buffer ini sekali per adegan.
Kemudian berikan masing-masing model buffer lain untuk menyimpan model-view matrix, normal matrix, inverses, dan properti materialnya. Ini diperbarui sekali untuk masing-masing model dan dapat dilakukan dalam pass pembaruan yang berbeda (jika / bila perlu). Informasi material dapat / harus dipindahkan ke buffer spesifik material ketiga jika Anda memiliki kemampuan untuk berbagi materi antara beberapa objek.
Dalam pengaturan penerusan ke depan, masuk akal untuk menempatkan semua lampu di buffer lain dan dalam naungan ditangguhkan juga masuk akal untuk menggunakan buffer per-cahaya untuk lampu lulus (sebagai pengganti model / material buffer yang digunakan dalam lulus geometri).
Perhatikan bahwa Anda memerlukan versi GL yang cukup terbaru untuk menggunakan buffer yang sama sekali (3,1 atau ekstensi; cukup umum hari ini kecuali pada beberapa laptop yang lebih tua tetapi masih dalam layanan) dan Anda memerlukan versi yang cukup baru untuk menjadi dapat mengikat buffer seragam ke lokasi pengikatan tertentu dari dalam kode shader (4.2; masih jarang tetapi menjadi lebih baik) jika tidak, Anda harus melakukan lebih banyak pekerjaan dalam kode sisi CPU Anda untuk mengatur sesuatu (kode CPU Anda perlu mengetahui ikatan yang benar tetap menunjukkan, jadi ini lebih merupakan bau API daripada masalah serius). Sayangnya OpenGL | ES tidak menambahkan buffer yang seragam hingga 3.0 yang masih tidak didukung pada platform seluler paling populer.
Jika buffer bukan opsi maka Anda akan memerlukan tempat global untuk menyimpan lokasi indeks untuk shader aktif. Anda dapat menggunakan glGetUniformLocation
setelah memuat shader Anda untuk menemukan indeks untuk nama-nama terkenal (suka ModelViewMatrix
atau sejenisnya) kemudian menyimpan indeks ini. Render Anda dapat memetakan nilai enum seperti yang MODEL_VIEW
diteruskan ke SetUniform
fungsi pembungkus untuk melihat ke dalam shader terikat, menemukan indeks, dan memanggil glUniform
dengan benar. Ini bukan perubahan besar khusus dalam penggunaan kode klien dari buffer selain perlu mengatur setiap seragam secara terpisah jika Anda mendapatkan semuanya dibungkus dengan baik.
Lihat Blok Inteface GLSL dan Objek Penyangga Seragam .