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?
Jawaban:
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.
sumber
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.
sumber
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.
sumber
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.
sumber