Tahap Shader Geometri
Tahap geometry-shader (GS) menjalankan kode shader yang ditentukan aplikasi dengan simpul sebagai input dan kemampuan untuk menghasilkan simpul pada output.
Shader Geometri
Tidak seperti shader puncak, yang beroperasi pada satu puncak, input shader geometri adalah simpul untuk primitif penuh (dua simpul untuk garis, tiga simpul untuk segitiga, atau puncak tunggal untuk titik). Shader geometri juga dapat membawa data puncak untuk primitif tepi yang berdekatan sebagai input (dua simpul tambahan untuk garis, tiga tambahan untuk segitiga). Ilustrasi berikut menunjukkan segitiga dan garis dengan simpul yang berdekatan.
Jenis | |
---|---|
TV | Sudut segitiga |
AV | Verteks yang berdekatan |
LV | Verteks garis |
Tahap geometry-shader dapat menggunakan nilai yang dihasilkan sistem SV_PrimitiveID yang dihasilkan secara otomatis oleh IA. Ini memungkinkan data per-primitif diambil atau dihitung jika diinginkan.
Tahap geometri-shader mampu menghasilkan beberapa simpul yang membentuk topologi yang dipilih tunggal (topologi output tahap GS yang tersedia adalah: tristrip, linestrip, dan daftar poin). Jumlah primitif yang dipancarkan dapat bervariasi secara bebas dalam pemanggilan shader geometri, meskipun jumlah maksimum simpul yang dapat dipancarkan harus dinyatakan secara statis. Panjang strip yang dipancarkan dari pemanggilan shader geometri dapat menjadi arbitrer, dan strip baru dapat dibuat melalui fungsi RestartStrip HLSL.
Output shader geometri dapat disalurkan ke tahap rasterizer dan/atau ke buffer vertex dalam memori melalui tahap output aliran. Output yang disalurkan ke memori diperluas ke daftar titik/garis/segitiga individual (persis seperti yang akan diteruskan ke rasterizer).
Ketika shader geometri aktif, shader tersebut dipanggil sekali untuk setiap primitif yang diturunkan atau dihasilkan sebelumnya dalam alur. Setiap pemanggilan shader geometri melihat sebagai input data untuk pemanggilan primitif, baik itu titik tunggal, satu baris, atau segitiga tunggal. Strip segitiga dari sebelumnya dalam alur akan menghasilkan pemanggilan shader geometri untuk setiap segitiga individu di strip (seolah-olah strip diperluas menjadi daftar segitiga). Semua data input untuk setiap puncak dalam primitif individu tersedia (yaitu 3 simpul untuk segitiga), ditambah data verteks yang berdekatan jika berlaku/tersedia.
Shader geometri menghasilkan data satu puncak pada satu waktu dengan menambahkan simpul ke objek aliran output. Topologi aliran ditentukan oleh deklarasi tetap, memilih salah satu dari: PointStream, LineStream, atau TriangleStream sebagai output untuk tahap GS. Ada tiga jenis objek aliran yang tersedia, PointStream, LineStream dan TriangleStream yang semuanya merupakan objek bertemplat. Topologi output ditentukan oleh jenis objek masing-masing, sementara format simpul yang ditambahkan ke aliran ditentukan oleh jenis templat. Eksekusi instans shader geometri bersifat atomik dari pemanggilan lain, kecuali bahwa data yang ditambahkan ke aliran bersifat serial. Output dari pemanggilan yang diberikan dari shader geometri tidak bergantung pada pemanggilan lain (meskipun pemesanan dihormati). Shader geometri yang menghasilkan strip segitiga akan memulai strip baru pada setiap pemanggilan.
Ketika output shader geometri diidentifikasi sebagai Nilai yang Ditafsirkan Sistem (misalnya SV_RenderTargetArrayIndex atau SV_Position), perangkat keras melihat data ini dan melakukan beberapa perilaku tergantung pada nilai, selain dapat meneruskan data itu sendiri ke tahap shader berikutnya untuk input. Ketika output data tersebut dari shader geometri memiliki arti pada perangkat keras secara per-primitif (seperti SV_RenderTargetArrayIndex atau SV_ViewportArrayIndex), daripada berdasarkan per puncak (seperti SV_ClipDistance[n] atau SV_Position), data per-primitif diambil dari puncak terkemuka yang dipancarkan untuk primitif.
Primitif yang diselesaikan sebagian dapat dihasilkan oleh shader geometri jika shader geometri berakhir dan primitif tidak lengkap. Primitif yang tidak lengkap dibuang secara diam-diam. Ini mirip dengan cara IA memperlakukan primitif yang diselesaikan sebagian.
Shader geometri dapat melakukan operasi pengambilan sampel beban dan tekstur di mana turunan ruang layar tidak diperlukan (samplelevel, samplecmplevelzero, samplegrad).
Algoritma yang dapat diimplementasikan dalam shader geometri meliputi:
- Ekspansi Sprite Titik
- Sistem Partikel Dinamis
- Generasi Fur/Fin
- Pembuatan Volume Bayangan
- Single Pass Render-to-Cubemap
- Pertukaran Bahan Per-Primitive
- Per-Primitive Penyiapan Material - Termasuk pembuatan koordinat barycentric sebagai data primitif sehingga shader piksel dapat melakukan interpolasi atribut kustom (misalnya interpolasi normal dengan urutan lebih tinggi, lihat Sampel CubeMapGS).
Topik terkait