Mengapa pipeline yang dapat diprogram (GLSL) lebih cepat dari pipeline tetap?

27

Jadi saya sedang belajar sendiri GLSL dan saya mencoba mencari tahu mengapa itu seharusnya lebih cepat daripada pipa fungsi tetap.

Alasan saya mengalami masalah adalah karena dari pemahaman saya, shader yang Anda buat menggantikan bagian dari pipa yang ada di sana sebelumnya. Jadi, bagaimana caranya menyediakan versi Anda sendiri untuk mempercepat?

Satu-satunya hal yang dapat saya pikirkan adalah jika Anda mencoba memberikan persamaan pencahayaan Anda sendiri sebelumnya, Anda harus melakukan perhitungan pada CPU, tetapi sekarang Anda dapat melakukan perhitungan pada GPU yang akan lebih cepat.

Apakah saya memahami ini dengan benar?

Joey Green
sumber
Apakah Anda bertanya apakah lebih cepat membuat versi Anda sendiri dari fungsi yang ada atau jika lebih cepat untuk melepas fungsi yang Anda hitung pada CPU?
MichaelHouse
Saya telah menemukan posting di gamedev.net yang menjawab pertanyaan saya.
Joey Green
2
Saya melihat. Anda harus memposting jawaban tentang itu di sini, sehingga orang lain bisa mendapat manfaat. Mungkin mengklarifikasi pertanyaan Anda dalam proses.
MichaelHouse
@ joey-green tolong tautkan gamedev.net di sini. Saya akan sangat membantu bagi orang-orang yang akan menemukan pertanyaan ini.
Quazi Irfan
1
Untuk membingungkan lebih banyak hal, dalam pengujian saya pipa tetap sebenarnya mungkin lebih cepat daripada shader, setidaknya dalam kasus sederhana; lihat sol.gfxile.net/instancing.html
Jari Komppa

Jawaban:

27

Shader yang Anda buat tidak akan menjadi versi Anda sendiri dari pipeline fungsi tetap (FFP), tetapi operasi manipulasi titik dan piksel khusus untuk mencapai sesuatu yang keren dan kompleks.

Banyak hal yang Anda lakukan melalui pipeline yang dapat diprogram (PP) akan bekerja lebih cepat daripada implementasi FFP yang mungkin, karena PP mengurangi jumlah lintasan atau jumlah sihir combiner dan cubemap yang diperlukan untuk menyajikan hal-hal hipotetis ini dalam FFP.

Bayangkan menerapkan hal biasa seperti pencahayaan per-pixel dalam FFP dengan hanya data vertex interpolasi dan tekstur sampel di tangan Anda. Bahkan tidak mungkin untuk melakukannya dengan "jujur", hanya peretasan untuk kasus-kasus khusus tergantung pada cubemaps yang telah dihitung sebelumnya dan beberapa campuran yang serius. Dengan PP itu menjadi masalah pewarnaan produk titik antara arah cahaya dan titik normal.

Secara keseluruhan, PP berubah menjadi lambat dan tidak mungkin menjadi cepat dan mungkin. Tetapi jika Anda memutuskan untuk menulis shader untuk mengimplementasikan algoritma yang sama yang digunakan dalam FFP, Anda akan mengetahui bahwa FFP akan sedikit lebih cepat karena sangat dioptimalkan untuk perangkat keras.

Cukup
sumber
1
Jawaban yang bagus ... +1.
Amir Zadeh
@ Hijau Tidak yakin tentang itu. Entah bagaimana meleset. Jawaban Kylotan jauh lebih tepat untuk pertanyaan yang sebenarnya.
Chris berkata Reinstate Monica
14

Secara teori, pipa yang dapat diprogram lebih lambat dari pipa fungsi tetap. Tidak ada prosesor tujuan umum yang dapat bersaing dengan prosesor kasus khusus. Pipeline fungsi tetap asli sedikit lebih dari sekelompok gerbang logika dalam garis yang secepat mungkin secara teoritis.

Namun, akhir-akhir ini pipa yang dapat diprogram adalah norma. Jadi perangkat kerasnya diarahkan pada pipa yang dapat diprogram. Setelah kehilangan efisiensi awal karena memiliki rangkaian yang khusus dibuat untuk satu aliran data tertentu, ia harus mengakomodasi kasus yang paling umum, yaitu pendekatan berbasis shader. Namun untuk opsi kompatibilitas ke belakang, pipeline fungsi tetap masih tersedia - tetapi biayanya adalah bahwa fungsi tetap lama harus ditransformasikan ke dalam shader, yang mungkin menimbulkan biaya. Ini akan menjelaskan perbedaan kinerja.

Kylotan
sumber
1

Alasan utama yang bisa saya pikirkan adalah fase dalam pipeline tetap, bahwa program Anda tidak membutuhkannya. misalnya gambar permainan di mana semua lampu statis, Anda dapat dengan mudah menerapkan shader yang bahkan tidak mencoba menghitung untuk cahaya dinamis. dalam hal ini Anda shader berjalan lebih cepat daripada shader yang dikompilasi yang memeriksa beberapa persamaan untuk cahaya dinamis (shader serba guna). ada contoh lain juga, Anda dapat dengan mudah memikirkan banyak aspek yang harus dipertimbangkan untuk pipa tetap tetapi Anda dapat mengabaikan penerapan kode GLSL Anda sendiri.

Ali1S232
sumber
1

Tepat seperti itu, shader Anda mengganti bagian dari pipa. Tetapi seringkali shader Anda dikhususkan untuk efek khusus yang ingin Anda capai dan tidak menangani setiap fitur khusus yang mungkin diaktifkan, oleh karena itu lebih sederhana daripada shader yang mengemulasi pipa fungsi lengkap lengkap. Sedangkan jalur fungsi tetap harus memperhitungkan banyak hal dan fitur OpenGL yang mungkin tidak ingin Anda gunakan (atau bahkan belum pernah mendengarnya).

Dan hari-hari di mana Anda memiliki fungsi-tetap dilakukan dalam perangkat keras khusus (berlawanan dengan perangkat keras yang sepenuhnya dapat diprogram) telah berakhir, apa yang mungkin terjadi ketika Anda menggunakan pipa fungsi-tetap adalah, bahwa driver Anda hanya memuat shader khusus yang mengimplementasikan jalur fungsi tetap. Tetapi ini mungkin sangat kompleks, untuk menyediakan setiap dan setiap fitur yang ditawarkan oleh fungsi pipa tetap.

Kata Chris Reinstate Monica
sumber
"Apa yang mungkin terjadi ketika Anda menggunakan pipeline fungsi-tetap adalah, bahwa driver Anda hanya memuat shader khusus yang mengimplementasikan jalur fungsi-tetap." ..apa kau yakin tentang ini? Bisakah Anda memberikan sumber daya yang andal? Terima kasih.
Quazi Irfan
@iamcreasy Saya tidak punya sumber yang bisa dipercaya (karena itu mungkin), saya harus akui. Tapi saya sangat ragu, bahwa kartu grafis jaman sekarang (yang hanya sekelompok prosesor kecil), masih memiliki perangkat keras khusus untuk komputasi pencahayaan atau komputasi kabut. Alih-alih lebih besar kemungkinan mereka hanya memuat program yang telah dikompilasi untuk ini ke tahap shader tertentu (apakah ini berasal dari driver atau penyimpanan ROM, saya tidak tahu).
Chris mengatakan Reinstate Monica
@iamcreasy menurut nouveau wiki nouveau.freedesktop.org/wiki/CodeNames , saluran pipa tetap dihapus di GeForce 6xxx.
Kotor iCE
"Apa yang mungkin terjadi ketika Anda menggunakan pipeline fungsi-tetap adalah, bahwa driver Anda hanya memuat shader khusus yang mengimplementasikan jalur fungsi-tetap." Benar. "Tapi ini mungkin sangat kompleks, untuk menyediakan setiap dan setiap fitur yang ditawarkan oleh pipeline fungsi tetap." Driver yang baik akan menghasilkan shader hanya untuk fungsionalitas yang telah Anda aktifkan.
Chris