Berapa banyak program OpenGL yang harus saya gunakan untuk membuat beberapa objek?

10

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?

Jacks_Gulch
sumber
1
"Kurasa aku harus membuat vertex shader untuk masing-masing." Mengapa Anda menganggap ini? Vertex shader akan mengubah simpul sesuai dengan model Anda dan melihat matriks dan Anda hampir selalu menginginkannya sama untuk semuanya.
usm

Jawaban:

8

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".

Jari Komppa
sumber
4
Selain itu, dalam banyak kasus Anda dapat pergi hanya dengan satu shader. Perbedaannya hanya pada seragam yang Anda berikan ke shader, seperti, warna, tekstur, peta normal, dll.
rioki
Ya, misalnya Anda mungkin memiliki shader "Bersisik" yang menghasilkan fragmen yang terlihat bersisik, dan yang berfungsi sedemikian rupa (sebagian besar shaders ...) yang dapat Anda buat semua 3 kubus, 1 silinder, dan 8 bola menggunakan itu satu shader (dengan primitif geometri yang sesuai, tentu saja). Serangkaian seragam yang masuk akal di sini mungkin nilai vektor yang menentukan warna, dan mungkin beberapa skalar atau sesuatu yang memengaruhi seberapa "bersisik" atau "mengkilap" efek visualnya. Kemudian Anda memiliki satu shader dan Anda mengubah cara shader mewarnai fragmen dengan mengubah seragam di antara gambar-gambar geometri individu.
Steven Lu
5

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.

Anko
sumber
+1 karena Anda menyebutkan apa yang dilakukan industri saat ini.
Krythic