Berapa banyak shader aktif pada satu frame dalam game yang harus saya gunakan biasanya? 5 atau lebih seperti 100?

20

Berapa banyak shader yang biasanya aktif, pada saat yang sama dalam satu adegan, dalam game modern? Saya tahu bahwa banyak shader digunakan, dengan gim beralih di antara mereka di setiap frame, dan biasanya menggambar objek melalui shader:

  1. Gambar semua objek dengan satu shader
  2. Ubah dari shader satu ke shader dua
  3. Gambar semua benda dengan shader dua

Meski begitu, saya tahu itu tidak sesederhana itu, terutama dengan efek seperti efek cahaya untuk seluruh adegan, membuat tekstur, dll., Tapi saya kira kita bisa menganggap itu berfungsi seperti itu sebagian besar waktu, kan? Pendekatan "group by shader" baik, karena mengganti shader adalah operasi yang mahal.

Dari satu sisi, Anda tidak dapat memiliki terlalu banyak shader, karena Anda ingin membuat adegan dengan cepat. Di sisi lain, Anda memerlukan banyak shader yang berbeda (atau uber-shader dengan cabang-cabang - sangat mirip) untuk kulit, logam, air dll.

Berapa banyak (dan mana) shader yang berbeda yang akan digunakan oleh game detektif 3D teoretis, modern, orang ketiga, untuk PC (DirectX 11, jika perlu)? Ini akan menjadi 5, 20 atau lebih seperti 100 shader aktif, hanya menghitung aktif, di beberapa "bingkai X"? Saya tahu ini bukan satu angka, tetapi saya ingin tahu skala dan faktor apa yang penting, dalam pertimbangan untuk permainan PC.


Dalam game sampel saya, saya akan menggunakan sekitar 9-11 per frame (hitung sebagai berbeda, shader kecil atau satu uber-shader - tidak masalah sekarang):

  1. Skin shader
  2. Eye shader (tidak terlalu banyak? Tetapi mereka berbeda)
  3. Shader logam
  4. Shader tanah
  5. Snow / rain shader (jika perlu)
  6. Water shader (jika air ada di lokasi)
  7. Cahaya shader (hanya ketika beberapa efek khusus yang terlibat)
  8. Shader pemancar cahaya (lampu jalan dll.)
  9. Shader standar (untuk semua yang lain, hanya shading standar)
  10. Shader standar dengan peta normal
  11. 2D shader (untuk GUI dll.)

Apakah "banyak" atau "tidak banyak"? Apakah saya lupa tentang beberapa shader penting yang saya perlukan?

PolGraphic
sumber

Jawaban:

28

Itu sangat tergantung pada tekniknya. Dalam render maju Anda sering memiliki satu shader untuk setiap jenis material yang berbeda. Dalam game AAA yang menggunakan teknik ini shader sering dihasilkan dari serangkaian opsi pada materi yang dapat diatur oleh seorang artis. Ini dapat menyebabkan ratusan shader (1). Tetapi katakanlah secara umum jumlah shader berada di urutan 40

Dalam peneduhan / rendering yang ditangguhkan Anda sering menyandikan jenis materi dalam buffer-G dan kemudian menggunakan satu shader besar untuk membuat dengan benar berbagai jenis bahan yang berbeda secara berbeda. Ini mengarah ke jauh lebih sedikit, tetapi lebih rumit, shader. Katakanlah jumlah shader di sini adalah di urutan 5.

(1) Sumber: Saya bekerja untuk kontraktor Crystal Dynamics di mana saya membangun alat untuk mengurangi jumlah shader yang dihasilkan untuk Tomb Raider karena pembuatan otomatis menjadi tidak terkendali;). Tujuannya adalah untuk mengurangi jumlah shader menjadi urutan 40 atau sekitar itu.

Roy T.
sumber
2
Terima kasih atas jawaban Anda - cukup rumit dan kaya. Saya baru saja memilihnya. Namun, saya akan menunggu beberapa hari sebelum penandaan, karena ini merupakan pertanyaan "terbuka" - mungkin orang lain akan memiliki sesuatu yang lebih untuk ditambahkan dari pengalaman mereka sendiri juga. Sekali lagi, terima kasih Roy :)
PolGraphic
s / less / less / ...
error
3

Saya tahu Anda menginginkan jawaban untuk PC. Tetapi saya akan menjawab apa yang saya lakukan di iOS dan saya tidak berharap mendapatkan tanda centang Anda.

Sepertinya Anda memiliki ide yang tepat. Akan berbeda untuk setiap aplikasi. Pada akhirnya ini semua tentang melakukan apa yang diperlukan untuk mendapatkan frame rate yang Anda inginkan. Di iPhone, tingkat sasaran saya adalah 60. Saya tidak suka itu sampai di bawah 30. Ketika saya memiliki ledakan dengan beberapa ratus partikel berbasis sprite animasi, ia turun menjadi 30 di iphone5 dan jauh lebih rendah di 4. Jadi Saya harus membuat keputusan tentang mengurangi kompleksitas pada perangkat tertentu. Dan kadang-kadang keputusan itu berpengaruh pada shader.

Tapi itu umumnya tidak mempengaruhi berapa banyak shader tetapi lebih pada shader yang saya gunakan untuk tugas berdasarkan frame rate goal saya.

Menurut pendapat saya shader saat digunakan dengan benar meningkatkan frame rate. Saya memiliki aplikasi yang memiliki 80 shader, tetapi tidak menggunakan semuanya pada satu frame - mungkin sekitar 10. Dan itu mengkompilasi mereka sesuai kebutuhan dan membuangnya di antara adegan. Dan pada perangkat keras saya, saya belum melihat frame rate efek efek shader. Hanya teknik yang digunakan dalam shader. Tapi yang pasti saya pikir menggunakan 2 shader serupa lebih baik untuk frame rate daripada memiliki yang lebih kompleks yang bercabang.

Saya juga memiliki shader yang mengurangi kualitas jika rendering lambat atau pada perangkat yang lebih lambat. Saya menggunakan pemetaan normal pada iPhone 5 tetapi menukar shader ke yang tidak melakukan pemetaan normal pada iPhone 4.

Saya suka jawaban Roy dan saya selalu berusaha mendapatkan wawasan tentang bagaimana game "nyata" dibuat. Karena saya belajar sendiri, saya tidak pernah tahu apakah penemuan hebat saya pada hari itu hanyalah bagaimana umumnya dilakukan atau masih beberapa langkah di belakang para profesional sejati.

badweasel
sumber
1
Tidak ada masalah dengan fakta bahwa jawaban Anda "adalah untuk iOS". Saya katakan tentang PC terutama karena saya ingin menghindari "itu tergantung pada platform" merespon singkat;) Mungkin jawaban Anda tidak 100% untuk saya. Tapi tetap saja, ini memiliki beberapa kesimpulan platform-independen sehingga saya merasa baik. Dan anggota komunitas lainnya (yang menggunakan iOS) mungkin merasa lebih berguna, jadi terima kasih dan pilih saya :)
PolGraphic
1

Anda tidak dapat benar-benar memberi nomor pada berapa banyak shader yang seharusnya atau tidak Anda miliki, karena tergantung pada faktor pembatas permainan Anda, serta platform target. Dalam praktiknya, mengurangi jumlah shader aktif menjadi "hanya sebanyak yang Anda butuhkan" harus diikuti. Terkadang ini berarti Anda hanya memiliki sedikit shader (10 atau lebih) sekaligus, dan kadang-kadang itu berarti Anda memiliki beberapa lusin.

Salah satu cara untuk membantu membatasi jumlah permutasi yang muncul di game Anda adalah dengan menerapkan teknik "ubershader", dimana hampir setiap shader berasal dari shader tunggal, dan perbedaan dan perilaku khusus ditukar melalui preprosesor. Tentu saja ada pengecualian untuk efek khusus seperti kedalaman bidang, oklusi ambien, dan sebagainya.

Pengalaman saya dengan game AAA hingga saat ini menunjukkan bahwa beberapa lusin shader aktif tidak masuk akal.

Evan
sumber