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