Untuk apa Hull, Domain, dan Geometri digunakan?

21

Saya telah melakukan bagian yang adil dari pemrograman game 3D untuk (mantan) majikan saya, dan juga di mesin kustom saya sendiri untuk game indie saya sendiri.

Awalnya, saya mulai dengan Direct3D 9, dan D3DX9, yang cukup banyak melakukan segalanya untuk saya, dan tidak mengharuskan saya untuk berpikir dalam hal shader sama sekali.

Setelah itu, saya menulis Direct3D 9 shader pertama saya, tetapi kebanyakan menggunakan satu shader yang sangat sederhana untuk semua yang saya lakukan.

Dalam iterasi terbaru dari mesin permainan saya, saya pindah ke Direct3D 11, dan dengan itu saya membuat banyak shader. Saya melakukan skinning GPU, partikel yang dihitung GPU, banyak efek pencahayaan dan pasca pemrosesan, semuanya dalam GPU. Hal yang sangat keren.

Sejauh ini saya hanya menggunakan vertex dan pixel / fragmen shaders. Meskipun masih ada banyak hal yang belum saya lakukan, saya percaya saya memiliki pengetahuan yang kuat tentang apa yang dilakukan vertex dan pixel / fragmen shaders, dan bagaimana semua itu cocok dengan keseluruhan pipa 3D.

Mengejar perkembangan yang lebih baru, saya menjadi sangat tertarik dengan tahap shader yang lebih baru. Yaitu, Geometry Shader, dan yang lebih baru, Hull dan Domain shader.

Saya belum pernah menggunakan tahapan ini, tetapi dari apa yang saya ketahui, Geometry shader, jika diaktifkan, dijalankan setelah vertex shader, satu kali untuk setiap vertex yang diubah (atau sekali per primitif?) Dan memungkinkan Anda untuk membuang simpul (dan primitif?) , dan buat yang baru (yang saya kira kembali ke awal pipa?).

Dugaan saya adalah bahwa penggunaan utama dari shader geometri adalah untuk secara terprogram menghasilkan geometri dalam GPU. Penggunaan yang umum adalah untuk membuat paha depan billboard berdasarkan pada satu titik, tapi saya tidak benar-benar memvisualisasikan banyak skenario umum selain menghasilkan fraktal dan hal-hal lain yang Anda dapat menghasilkan 100% secara sistematis.

Sedangkan untuk Hull dan Domain shaders, sepertinya itu terkait dengan tessellation (membuat permukaan lebih halus dari permukaan kasar?), Dan harus digunakan bersama-sama atau tidak sama sekali. Istilah "tambalan" juga tampaknya umum di sini.

Adakah yang mau menjelaskan kepada saya, secara praktis, untuk apa tahap shader new-ish ini, bagaimana mereka masuk ke dalam pipa 3D, dan dalam kasus apa saya harus mempertimbangkan menggunakannya?

Piyama Panda
sumber
Saya pikir Anda bertanya dengan cara yang salah - daripada "apa yang mereka gunakan untuk" Anda harus bertanya "apa yang mereka lakukan" - jika Anda memahami sumber daya yang diberikan (dan konsep di bawah kap mereka) hanya langit yang membatasi apa yang Anda lakukan sebenarnya bisa dilakukan dengan mereka.
wonderra
@wondra: Ini pertanyaan yang hampir sama, tetapi saya ingin lebih fokus pada sampel penggunaan praktis, daripada penjelasan teoritis tentang apa yang mereka lakukan. Bahkan, ada gambaran umum tentang MSDN yang saya baca berkali-kali, tetapi masih tidak mengerti apa yang bisa mereka lakukan untuk saya. Saya adalah makhluk yang cerdas, dan saya dapat menghubungkan A dan B, dan mencari tahu C, D, E dan F dari itu.
Panda Pyjama
Saya tidak tahu, "contoh penggunaan praktis" tampaknya agak luas bagi saya. Saya mengambil bacokan itu, tapi sebelum komentar ini jadi mungkin terlalu fokus pada "apa yang mereka lakukan" untuk Anda.
@ Josh: Apakah Anda menggunakan, atau apakah Anda menggunakan semua tahapan ini di dunia nyata?
Panda Pyjama
1
FYI bagi mereka yang memiliki latar belakang non-directx (seperti saya), keduanya disebut "Tessellation control shader" dan "Tessellation evaluation shader" di OpenGL dan Vulkan.
Shahbaz

Jawaban:

13

Hull & Domains

Tahap lambung dan domain shader adalah bagian dari pipa tessellation GPU. Mereka umumnya digunakan untuk menghitung geometri permukaan yang sangat detail berdasarkan pada geometri permukaan input dengan detail lebih rendah, yang didefinisikan sebagai segitiga atau paha depan (et cetera). Input primitif dengan detail lebih rendah disebut "tambalan," dan penting untuk dicatat bahwa mereka mungkin tidak mewakili geometri aktual yang pada akhirnya akan ada (walaupun mereka bisa). Pikirkan lebih seperti titik kontrol dari kurva bezier, kecuali permukaan.

Hull shader mengambil tambalan input dan menghasilkan tambalan keluaran (atau tambalan; ini adalah di mana pembagian tambalan umumnya akan terjadi). Metadata konstan tentang tambalan juga dapat dihitung dalam shader lambung dan output untuk diproses oleh tahap-tahap selanjutnya dari pipa.

Output hull shader berjalan melalui tahap tessellation (fungsi tetap) yang menghasilkan domain ubin dan dinormalisasi dari jenis yang sesuai (misalnya, paha depan atau segitiga).

Domain shader dijalankan terhadap domain-domain ini untuk menghitung posisi vertex aktual dari setiap titik tertentu dalam domain yang dihasilkan dari tessellation yang disebutkan di atas. Domain shader dengan demikian menampilkan posisi titik.

Fase tessellation terjadi setelah tahap shader vertex dalam pipa.

Shader Geometri

Geometri shader seperti shader lambung / domain yang disederhanakan. Mereka hanya mengambil simpul input dan menghasilkan simpul output. Untuk simpul input yang diberikan, banyak simpul output dapat diproduksi, sehingga dapat digunakan untuk "menghasilkan geometri."

Tahap geometri shader terjadi setelah vertex shader, dan setelah tahap tessellation.

Penggunaan

Shader geometri dapat menulis untuk mengalirkan buffer output alih-alih diumpankan langsung ke fase rasterisasi dan fragmen fragmen pipa; ini secara efektif berarti Anda dapat menjalankan kembali geometri yang dihasilkan oleh kombinasi iterasi vertex / hull / domain / geometri kembali melalui pipa, untuk melakukan pekerjaan tambahan dalam tahap shader vertex lain atau apa pun.

Apa yang dapat Anda gunakan untuk ini adalah topik yang agak luas, efektif-tidak terbatas, jadi saya tidak akan benar-benar berusaha mengatasinya. Tetapi untuk beberapa alasan yang memotivasi untuk mempertimbangkan menggunakannya ... Hal besar tentang tahapan shader ini adalah mereka memungkinkan Anda mendapatkan detail ekstra yang berpotensi cukup banyak tanpa harus membayar biaya memori atau bandwidth untuk semua itu, setiap saat. Dan juga untuk memindahkan pemrosesan dari CPU ke GPU.

Terrain adalah contoh yang baik di mana Anda mungkin ingin menggunakan beberapa teknologi ini, karena Anda umumnya perlu melihatnya sangat dekat (karena karakter Anda berdiri di atasnya) dan sangat jauh (pegunungan di kejauhan) dan mampu untuk mengontrol di mana dan berapa banyak detail yang Anda masukkan ke dalam geometri medan "dengan cepat" melalui tahapan shader ini sangat kuat. Alternatif secara historis telah membayar biaya rata-rata konstan untuk medan setiap saat (pendekatan terendah-umum-penyebut) atau secara manual paging potongan geometri untuk berbagai tingkat detail dalam dan keluar dari memori GPU, yang membosankan dan membosankan. mahal.

Situasi serupa di mana Anda mungkin memiliki rentang level detail yang sangat luas yang perlu Anda dukung untuk beberapa mesh atau model yang juga dapat dibagi lagi secara wajar dapat menjadi kandidat untuk melakukan sesuatu yang pintar dengan shader ini juga. Namun, tidak semua yang diterjemahkan dengan baik ke optimasi gaya permukaan subdivisi . Anda mungkin bisa menggunakannya untuk kain dan rambut juga.

Untuk bacaan lebih lanjut, termasuk jauh lebih detail daripada yang bisa saya ingat atau masuk ke sini:


sumber
4
Ingatlah bahwa hull & domain shaders memerlukan perangkat keras Direct3D Level Level 11.0 atau lebih baru, dan pelindung geometri membutuhkan perangkat keras Direct3D Level Level 10.0 atau yang lebih baru. Juga, sebagian besar desain kartu video memberikan tingkat geometri shader sangat sedikit hingga tidak ada perangkat keras khusus, sehingga utilitasnya dalam praktik jauh lebih sedikit daripada yang semula diperkirakan.
Chuck Walbourn
@ChuckWalbourn: Saya benar-benar ingin mendengar lebih banyak, jika Anda mau, dalam jawaban terpisah
Panda Pyjama