Adegan saya memiliki beberapa objek di dalamnya. (Katakanlah 3 kubus, 1 silinder, 8 bola.) Saya menganggap saya harus membuat shader vertex untuk masing-masing. Berapa banyak program yang harus saya miliki?
Alternatif:
- Satu program per objek
- Satu program untuk semua kubus dan lainnya untuk semua bidang (dengan asumsi mereka menggunakan shader yang sama)
- Satu program besar untuk semuanya
Apa pendekatan yang benar?
opengl
shaders
architecture
Jacks_Gulch
sumber
sumber
Jawaban:
Anda harus mempertimbangkan program shader sebagai bagian yang mirip dengan negara bagian sebagai tekstur. Mengubah status itu mahal, jadi Anda mungkin bisa menggabungkan beberapa tekstur menjadi satu untuk menghindari perubahan tekstur; hal yang sama berlaku untuk shader - Anda mungkin dapat menggabungkan beberapa shader untuk menghindari perubahan status.
Sama halnya dengan menggabungkan tekstur, menggabungkan shader dilengkapi dengan overhead - jika Anda hanya membuat area 16x16 piksel dari tekstur 4096x4096, Anda tidak menggunakan perangkat keras secara efisien. Demikian pula, jika objek yang Anda render hanya menggunakan 10% dari kode di shader Anda, mungkin (dan bahkan mungkin) bahwa kartu grafis menghitung banyak hal yang tidak perlu.
Singkatnya, "tergantung".
sumber
Yang terbaik adalah menjaga hal-hal sesederhana mungkin. Duplikasi shader yang sama untuk setiap objek tidak perlu dan akan cepat membengkak. Anda juga tidak ingin satu shader raksasa yang menutupi setiap use-case yang mungkin, karena hal ini menyebabkan overhead yang tidak perlu.
Ada beberapa pendapat tentang manajemen shader dan tidak ada cara "optimal" untuk melakukan pendekatan ini. Saya bahkan telah melihat beberapa implementasi shader di mana setiap shader dihasilkan berdasarkan parameter off-the-fly (misalnya di mesin Unreal ).
Untuk seseorang yang baru memulai di area ini, mungkin lebih baik untuk menuliskan shader dasar terlebih dahulu. Sebagai contoh, saya memiliki shader untuk objek tanpa tekstur, shader dengan tekstur dasar dan dukungan per-pixel-pencahayaan, dll ... Lalu setiap kali saya menginginkan efek berbeda yang tidak dapat dilakukan menggunakan shader sebelumnya, maka saya akan akan membuat yang baru untuk efek baru.
Tujuan dari sistem seperti itu adalah untuk menjaga hal-hal sederhana. Hanya. Menjaga. Itu. Sederhana.
sumber