Apakah panggilan draw dieksekusi secara paralel atau berurutan atau keduanya?

8

Ini tindak lanjut untuk pertanyaan yang saya jawab di GameDev SE. Pertanyaannya hanyalah Apakah glDrawArraysInstanced dalam OpenGL paralel saat menggambar instance tersebut?

Jawaban saya ada di baris "GPU mungkin melakukan beberapa panggilan seri secara paralel tergantung pada beberapa hal, misalnya jika dua panggilan draw menggunakan shader vertex yang sama." Inilah jawaban lengkapnya .

Dalam komentar OP disebutkan, "Saya pikir itu harus berurutan. Lagi pula, beberapa blending mode tergantung dari urutan"

Sekarang, saya agak bingung. Apakah jawaban saya akan tetap memparalelkannya saat valid? Adakah yang bisa menjelaskan hal ini?

concept3d
sumber

Jawaban:

9

Hasilnya harus seolah-olah dieksekusi secara berurutan satu segitiga pada suatu waktu. Ini penting agar setiap frame bersifat deterministik. Jika tidak maka menggambar bingkai yang sama beberapa kali dapat membuat hasil yang berbeda dan membuat gambar yang berkedip di layar.

Namun itu tidak berarti paralelisasi tidak mungkin . Verteks dapat dihitung secara paralel. Hasilnya akan dipesan dan diumpankan ke rasterizer yang akan memberi makan tahap shader fragmen.

Hal yang sama terjadi dengan piksel. Biasanya sekelompok piksel dari segitiga dapat dihitung secara paralel dan dicampur. Segitiga yang tidak tumpang tindih kemudian dapat juga diisi pada saat yang sama. Namun jika segitiga tumpang tindih yang sedang sibuk maka hasil shader fragmen harus disangga sampai piksel yang sesuai dari segitiga sebelumnya dilakukan sehingga pencampuran dapat terjadi dalam urutan yang benar.

aneh ratchet
sumber
Sangat mungkin untuk menjalankan pixel shader untuk segitiga yang tumpang tindih secara bersamaan. Yang penting adalah bahwa blending terjadi secara berurutan. Pixel shaders dapat memulai banyak pekerjaan ke unit blending dalam urutan apa pun, yang kemudian dapat menyusun ulang semua operasi campuran tersebut tergantung pada segitiga tempat asalnya.
John Calsbeek
Saya telah melihat situasi di mana kerlipan terjadi karena beberapa segitiga terletak pada bidang yang sama, tetapi saya tidak ingat apakah itu terjadi ketika kamera / dunia / dll. Transformasi bersifat statis atau jika diperlukan gerakan dan perhitungan kembali. Itu kasus tepi, meskipun.
JAB
@ JAB Sepertinya Anda mengacu pada z- fight . Ini biasanya terjadi karena fakta bahwa bahkan jika dua primitif secara analitik co-planar, kuantisasi dalam interpolator menghasilkan pola di mana beberapa piksel dari kedua primitif terlihat. Pola akan bergeser, menyebabkan kerlip, hanya jika simpul (atau kamera) dipindahkan, jika tidak, pola interferensi harus konsisten di antara frame.
MooseBoys
@ MooseBoys Itulah tepatnya, ya. Sudah beberapa tahun sejak saya melakukan banyak hal dengan grafik 3D.
JAB
Selain hanya menjalankan banyak simpul dan piksel secara paralel, dimungkinkan juga beberapa panggilan undian untuk terbang bersamaan, jika sumber daya GPU cukup tersedia dan tidak ada ketergantungan antara panggilan draw.
Nathan Reed