Apakah saya kehilangan / memperoleh kinerja untuk membuang piksel meskipun saya tidak menggunakan pengujian mendalam?


22

Ketika saya pertama kali mencari instruksi untuk membuang, saya telah menemukan para ahli mengatakan menggunakan membuang akan mengakibatkan kinerja menguras. Mereka mengatakan, membuang piksel akan merusak kemampuan GPU untuk menggunakan zBuffer dengan benar karena GPU harus menjalankan Fragment shader untuk kedua objek terlebih dahulu untuk memeriksa apakah yang lebih dekat ke kamera dibuang atau tidak. Untuk game 2D yang saat ini saya kerjakan, saya telah menonaktifkan tes kedalaman dan penulisan kedalaman. Saya menggambar semua objek yang diurutkan berdasarkan kedalamannya dan itu saja, tidak perlu GPU untuk melakukan hal-hal mewah. sekarang saya bertanya-tanya apakah masih buruk jika saya membuang piksel di shader fragmen saya?

Jawaban:


20

Perangkat keras grafis dapat melakukan pemusnahan fragmen berbasis kedalaman awal sebelum menghitung nilai warnanya (dengan kata lain, sebelum menjalankan shader fragmen Anda). Akibatnya, jika Anda menggunakan fitur apa pun yang akan memengaruhi itu, seperti discard, pengujian alfa, atau memanipulasi gl_FragDepthkemampuan perangkat keras untuk melakukan optimasi itu akan dikompromikan karena kedalaman sebenarnya dari fragmen tidak dapat diasumsikan dan shader penuh harus dijalankan.

Namun, apakah penggunaan salah satu dari fitur yang dikompromikan itu memiliki dampak kinerja yang dapat diamati tergantung pada situasinya. Optimalisasi awal-z dapat meningkatkan kinerja jika Anda memiliki shader fragmen yang sangat mahal, misalnya, tetapi jika biaya pipa Anda ada di vertex shader (atau di tempat lain) itu tidak akan menguntungkan Anda sebanyak itu, dan akibatnya Anda mungkin melihat sedikit atau tidak ada penurunan kinerja dengan menggunakan discard.

Menonaktifkan pengujian mendalam sepenuhnya melalui API harus mencegah pengoptimalan berjalan juga, karena dapat menghasilkan adegan yang dirender secara tidak benar. Jadi, dalam kasus Anda, seharusnya tidak masalah yang Anda gunakan discard.

Perangkat keras terbaru dapat memaksa tes (termasuk tes stensil awal) menggunakan layout(early_fragment_tests)- ada lebih banyak informasi (dan peringatan) pada halaman ini yang saya tautkan di awal jawaban.


3

Seperti biasa untuk pertanyaan kinerja, jawaban paling akurat adalah mencobanya di perangkat keras target Anda dan mengukur apa yang terjadi.

Dalam kasus Anda itu mungkin bukan hal yang buruk untuk dilakukan. Bahkan ada kemungkinan itu akan membantu kinerja dengan menghemat bandwidth memori. Ini juga akan menambah instruksi shader, jadi itu tidak selalu menguntungkan kinerja.

Bahkan ketika menggunakan buffer kedalaman, hit kinerja tidak selalu sangat signifikan, jika Anda berhati-hati dengan urutan Anda menggambar sesuatu.

Ada sebuah posting blog di https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ yang menjelaskan secara terperinci bagaimana pengujian mendalam awal dapat bekerja dalam perangkat keras, dan batasan apa yang mungkin ada.


1
Sebenarnya setelah pengujian saya pikir aman untuk menganggap saya tidak kehilangan atau mendapatkan kinerja, tetapi saya sedang mencari jawaban yang memberikan penjelasan mendalam apa dan mengapa akan terjadi.
Ali1S232
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.