Semantik
Semantik adalah string yang dilampirkan ke input atau output shader yang menyampaikan informasi tentang penggunaan parameter yang dimaksudkan. Semantik diperlukan pada semua variabel yang dilewatkan di antara tahap shader. Sintaks untuk menambahkan semantik ke variabel shader ditampilkan di sini (Sintaks Variabel (DirectX HLSL)).
Secara umum, data yang diteruskan di antara tahap alur sepenuhnya generik dan tidak ditafsirkan secara unik oleh sistem; semantik arbitrer diperbolehkan yang tidak memiliki arti khusus. Parameter (dalam Direct3D 10 dan yang lebih baru) yang berisi semantik khusus ini disebut sebagai Semantik Nilai Sistem.
Semantik Didukung di Direct3D 9 dan Direct3D 10 dan yang lebih baru
Jenis semantik berikut didukung di Direct3D 9 dan Direct3D 10 dan yang lebih baru.
Semantik Shader Vertex
Semantik ini memiliki arti ketika dilampirkan ke parameter vertex-shader. Semantik ini didukung di Direct3D 9 dan Direct3D 10 dan yang lebih baru.
Input | Deskripsi | Jenis |
---|---|---|
BINORMAL[n] | Binormal | float4 |
BLENDINDICES[n] | Blend indeks | uint |
BLENDWEIGHT[n] | Bobot campuran | float |
COLOR[n] | Warna difus dan spekular | float4 |
NORMAL[n] | Vektor normal | float4 |
POSISI[n] | Posisi puncak di ruang objek. | float4 |
POSISI | Posisi vertex yang diubah. | float4 |
PSIZE[n] | Ukuran titik | float |
TANGEN[n] | Tangen | float4 |
TEXCOORD[n] | Koordinat tekstur | float4 |
Output | Deskripsi | Jenis |
---|---|---|
COLOR[n] | Warna difus atau spekular | float4 |
KABUT | Kabut puncak | float |
POSISI[n] | Posisi puncak di ruang homogen. Posisi komputasi dalam ruang layar dengan membasis (x,y,z) dengan w. Setiap shader vertex harus menulis parameter dengan semantik ini. CATATAN: Semantik ini tersedia di Direct3D 9. Untuk Direct3D 10 dan yang lebih baru, gunakan SV_Position sebagai gantinya. | float4 |
PSIZE | Ukuran titik | float |
TESSFACTOR[n] | Faktor Tessellation | float |
n
adalah bilangan bulat opsional antara 0 dan jumlah sumber daya yang didukung. Misalnya, POSITION0, TEXCOORD1, dll.
Semantik Pixel Shader
Semantik ini memiliki arti ketika dilampirkan ke parameter input pixel-shader. Semantik ini didukung di Direct3D 9 dan Direct3D 10 dan yang lebih baru.
Input | Deskripsi | Jenis |
---|---|---|
COLOR[n] | Warna difus atau spekular. | float4 |
TEXCOORD[n] | Koordinat tekstur | float4 |
VFACE | Skalar floating-point yang menunjukkan harga yang menghadap ke belakang. Nilai negatif menghadap ke belakang, sementara nilai positif menghadap ke kamera.
Catatan: |
float |
VPOS | Lokasi piksel (x,y) di ruang layar. Untuk mengonversi shader Direct3D 9 (yang menggunakan semantik ini) ke shader Direct3D 10 dan yang lebih baru, lihat Direct3D 9 VPOS dan Direct3D 10 SV_Position) | float2 |
Output | Deskripsi | Jenis |
---|---|---|
COLOR[n] | Warna output | float4 |
KEDALAMAN[n] | Kedalaman output | float |
n
adalah bilangan bulat opsional antara 0 dan jumlah sumber daya yang didukung. Misalnya, PSIZE0, COLOR1, dll.
Semantik COLOR hanya valid dalam mode kompatibilitas shader (yaitu, ketika shader dibuat menggunakan D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY).
Semantik Hanya Didukung untuk Direct3D 10 dan Lebih Baru.
Jenis semantik berikut telah diperkenalkan baru untuk Direct3D 10 dan tidak tersedia untuk Direct3D 9.
Semantik Nilai Sistem
Semantik nilai sistem baru untuk Direct3D 10. Semua nilai sistem dimulai dengan awalan SV_, contoh umumnya adalah SV_POSITION, yang ditafsirkan oleh tahap rasterizer. Nilai sistem valid di bagian lain dari alur. Misalnya, SV_Position dapat ditentukan sebagai input ke shader vertex serta output. Shader Piksel hanya dapat menulis ke parameter dengan semantik nilai sistem SV_Depth dan SV_Target.
Nilai sistem lainnya (SV_VertexID, SV_InstanceID, SV_IsFrontFace) hanya dapat dimasukkan ke dalam shader aktif pertama dalam alur yang dapat menafsirkan nilai tertentu; setelah itu fungsi shader harus meneruskan nilai ke tahap berikutnya.
SV_PrimitiveID adalah pengecualian untuk aturan ini hanya dimasukkan ke dalam shader aktif pertama dalam alur yang dapat menafsirkan nilai tertentu; perangkat keras dapat memberikan nilai ID yang sama dengan input ke tahap hull-shader, tahap domain-shader, dan setelah itu tahap mana pun adalah tahap pertama yang diaktifkan: tahap geometry-shader atau tahap pixel-shader.
Jika tessellation diaktifkan, tahap hull-shader dan tahap domain-shader ada. Untuk patch tertentu, PrimitiveID yang sama berlaku untuk pemanggilan hull-shader patch, dan semua pemanggilan shader domain tessellated. PrimitiveID yang sama juga menyebar ke tahap aktif berikutnya; tahap geometry-shader atau tahap pixel-shader jika diaktifkan.
Jika input shader geometri SV_PrimitiveID dan karena dapat menghasilkan nol atau satu atau beberapa primitif per pemanggilan, shader harus memprogram pilihan nilai SV_PrimitiveID sendiri untuk setiap output primitif jika input shader piksel berikutnya SV_PrimtiveID.
Sebagai contoh lain, SV_PrimitiveID tidak dapat ditafsirkan oleh tahap vertex-shader karena vertex dapat menjadi anggota dari beberapa primitif.
Semantik ini telah ditambahkan ke Direct3D 10; mereka tidak tersedia di Direct3D 9.
Semantik nilai sistem untuk tahap rasterizer.
Semantik Nilai Sistem | Deskripsi | Jenis |
---|---|---|
SV_ClipDistance[n] | Data jarak klip. SV_ClipDistance masing-masing diasumsikan sebagai jarak yang ditandatangani float32 ke bidang. Penyiapan primitif hanya memanggil rasterisasi pada piksel tempat jarak >bidang terinterpolasi = 0. Beberapa bidang klip dapat diimplementasikan secara bersamaan, dengan mendeklarasikan beberapa komponen dari satu atau beberapa elemen vertex sebagai SV_ClipDistance. Nilai jarak klip dan isolasi gabungan adalah sebagian besar komponen D3D#_CLIP_OR_CULL_DISTANCE_COUNT di sebagian besar daftar D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. Tersedia untuk semua shader yang akan dibaca atau ditulis, kecuali shader vertex yang dapat menulis nilai tetapi tidak menganggapnya sebagai input. Atribut clipplanes berfungsi seperti SV_ClipDistance tetapi berfungsi pada semua tingkat fitur perangkat keras 9_x dan yang lebih tinggi. Untuk informasi selengkapnya, lihat Bidang klip pengguna pada perangkat keras tingkat fitur 9. |
float |
SV_CullDistance[n] | Data jarak cull. Ketika komponen elemen vertex diberikan label ini, nilai-nilai ini masing-masing diasumsikan sebagai jarak yang ditandatangani float32 ke bidang. Primitif akan sepenuhnya dibuang jika jarak bidang untuk semua simpul dalam primitif adalah < 0. Beberapa bidang pemusnah dapat digunakan secara bersamaan, dengan mendeklarasikan beberapa komponen dari satu atau beberapa elemen vertex sebagai SV_CullDistance. Nilai jarak klip dan isolasi gabungan adalah sebagian besar komponen D3D#_CLIP_OR_CULL_DISTANCE_COUNT di sebagian besar daftar D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. Tersedia untuk semua shader yang akan dibaca atau ditulis, kecuali shader vertex yang dapat menulis nilai tetapi tidak menganggapnya sebagai input. |
float |
SV_Coverage | Masker yang dapat ditentukan pada input, output, atau kedua shader piksel. Untuk SV_Coverage pada shader piksel, OUTPUT didukung pada ps_4_1 atau yang lebih tinggi. Untuk SV_Coverage pada shader piksel, INPUT memerlukan ps_5_0 atau lebih tinggi. |
uint |
SV_Depth | Data buffer kedalaman. Dapat ditulis oleh piksel shader. | float |
SV_DepthGreaterEqual | Dalam shader piksel, memungkinkan kedalaman output, selama lebih besar dari atau sama dengan nilai yang ditentukan oleh rasterizer. Memungkinkan penyesuaian kedalaman tanpa menonaktifkan Z awal. | float |
SV_DepthLessEqual | Dalam shader piksel, memungkinkan kedalaman output, selama kurang dari atau sama dengan nilai yang ditentukan oleh rasterizer. Memungkinkan penyesuaian kedalaman tanpa menonaktifkan Z awal. | float |
SV_DispatchThreadID | Menentukan offset utas global dalam panggilan Pengiriman, per dimensi grup. Tersedia sebagai input ke shader komputasi. (baca saja) | uint3 |
SV_DomainLocation | Menentukan lokasi pada lambung titik domain saat ini yang sedang dievaluasi. Tersedia sebagai input ke shader domain. (baca saja) | float2|3 |
SV_GroupID | Menentukan offset grup dalam panggilan Pengiriman, per dimensi panggilan pengiriman. Tersedia sebagai input ke shader komputasi. (baca saja) | uint3 |
SV_GroupIndex | Menyediakan indeks yang diratakan untuk utas tertentu dalam grup tertentu. Tersedia sebagai input ke shader komputasi. (baca saja) | uint |
SV_GroupThreadID | Menentukan offset utas dalam grup, per dimensi grup. Tersedia sebagai input ke shader komputasi. (baca saja) | uint3 |
SV_GSInstanceID | Menentukan instans shader geometri. Tersedia sebagai input ke shader geometri. Instans diperlukan sebagai shader geometri dapat dipanggil hingga 32 kali pada geometri primitif yang sama. | uint |
SV_InnerCoverage | Mewakili informasi rasterisasi konservatif yang diremehkan (yaitu apakah piksel dijamin sepenuhnya tercakup). Dapat dibaca atau ditulis oleh shader piksel. | |
SV_InsideTessFactor | Mendefinisikan jumlah tessellation dalam permukaan patch. Tersedia di shader lambung untuk menulis, dan tersedia di shader domain untuk dibaca. | float|float[2] |
SV_InstanceID | Pengidentifikasi per instans secara otomatis dihasilkan oleh runtime (lihat Menggunakan Nilai yang Dihasilkan Sistem (Direct3D 10)). Tersedia untuk semua shader. | |
SV_IsFrontFace | Menentukan apakah segitiga menghadap ke depan. Untuk baris dan titik, IsFrontFace memiliki nilai true. Pengecualiannya adalah garis yang digambar dari segitiga (mode wireframe), yang mengatur IsFrontFace dengan cara yang sama seperti mem-rasterisasi segitiga dalam mode solid. Dapat ditulis oleh shader geometri, dan dibaca oleh shader piksel. | bool |
SV_OutputControlPointID | Menentukan indeks ID titik kontrol yang sedang dioperasikan oleh pemanggilan titik masuk utama shader lambung. Dapat dibaca oleh shader lambung hanya. | uint |
SV_Position | Ketika SV_Position dideklarasikan untuk input ke shader, itu dapat memiliki salah satu dari dua mode interpolasi yang ditentukan: linearNoPerspective atau linearNoPerspectiveCentroid, di mana yang terakhir menyebabkan nilai xyzw yang di-snap sentroid disediakan saat antialias multisampel. Saat digunakan dalam shader, SV_Position menjelaskan lokasi piksel. Tersedia di semua shader untuk mendapatkan pusat piksel dengan offset 0,5. | float4 |
SV_PrimitiveID | Pengidentifikasi per primitif secara otomatis dihasilkan oleh runtime (lihat Menggunakan Nilai yang Dihasilkan Sistem (Direct3D 10)). Dapat ditulis oleh geometri atau shader piksel, dan dibaca oleh geometri, piksel, lambung, atau shader domain. | uint |
SV_RenderTargetArrayIndex | Indeks array target render. Diterapkan ke output shader geometri, dan menunjukkan ikhtisar array target render bahwa primitif akan digambar oleh shader piksel. SV_RenderTargetArrayIndex hanya valid jika target render adalah sumber daya array. Semantik ini hanya berlaku untuk primitif; jika primitif memiliki lebih dari satu puncak, maka nilai dari vertex terkemuka digunakan. Nilai ini juga menunjukkan iringan array mana dari tampilan kedalaman/stensil yang digunakan untuk tujuan baca/tulis. Dapat ditulis dari shader geometri, dan dibaca oleh shader piksel. Jika D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer adalah true , maka SV_RenderTargetArrayIndex diterapkan ke shader apa pun yang memberi makan rasterizer. |
uint |
SV_SampleIndex | Contoh data indeks frekuensi. Tersedia untuk dibaca atau ditulis oleh shader piksel saja. | uint |
SV_StencilRef | Mewakili nilai referensi stensil shader piksel saat ini. Hanya dapat ditulis oleh shader piksel. | uint |
SV_Target[n], di mana 0 <= n <= 7 | Nilai output yang akan disimpan dalam target render. Indeks menunjukkan dari 8 target render mana yang mungkin terikat untuk ditulis. Nilai tersedia untuk semua shader. | float[2|3|4] |
SV_TessFactor | Menentukan jumlah tessellation pada setiap tepi patch. Tersedia untuk menulis di shader lambung dan membaca di shader domain. | float[2|3|4] |
SV_VertexID | Pengidentifikasi per vertex secara otomatis dihasilkan oleh runtime (lihat Menggunakan Nilai yang Dihasilkan Sistem (Direct3D 10)). Tersedia sebagai input ke shader vertex saja. | uint |
SV_ViewportArrayIndex | Indeks array viewport. Diterapkan ke output shader geometri, dan menunjukkan viewport mana yang akan digunakan untuk primitif yang saat ini sedang ditulis. Dapat dibaca oleh shader piksel. Primitif akan diubah dan diklip terhadap viewport yang ditentukan oleh indeks sebelum diteruskan ke rasterizer. Semantik ini hanya berlaku untuk primitif; jika primitif memiliki lebih dari satu puncak, maka nilai dari vertex terkemuka digunakan. Jika D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer adalah true , maka SV_ViewportArrayIndex diterapkan pada shader apa pun yang memberi makan rasterizer. |
uint |
SV_ShadingRate | Menentukan, melalui nilai laju bayangan, jumlah piksel yang ditulis oleh satu pemanggilan shader piksel untuk Tingkat Bayangan Variabel Tingkat 2 atau perangkat yang lebih tinggi. Dapat dibaca dari shader piksel. Dapat ditulis dari vertex atau shader geometri. | uint |
Batasan saat menulis SV_Depth:
- Ketika multisampling (MultisampleEnable true dalam D3D10_RASTERIZER_DESC) dan menulis nilai kedalaman (menggunakan shader piksel), nilai tunggal yang ditulis juga digunakan dalam pengujian kedalaman; sehingga kemampuan untuk merender tepi primitif pada resolusi yang lebih tinggi hilang saat multisampling.
- Saat menggunakan kontrol aliran dinamis, tidak mungkin untuk menentukan pada waktu kompilasi apakah shader yang menulis SV_Depth di beberapa jalur akan dijamin untuk menulis SV_Depth di setiap eksekusi. Kegagalan menulis SV_Depth ketika dinyatakan menghasilkan perilaku yang tidak terdefinisi (yang mungkin atau mungkin tidak termasuk membuang piksel).
- Setiap nilai float32 termasuk +/-INF dan NaN dapat ditulis ke SV_Depth.
- Menulis SV_Depth masih valid saat melakukan Blending Warna Sumber Ganda.
Migrasi dari Direct3D 9 ke Direct3D 10 dan yang lebih baru
Masalah berikut harus dipertimbangkan saat memigrasikan kode dari Direct3D 9 ke Direct3D 10 dan yang lebih baru:
Pemetaan ke Semantik Direct3D 9
Beberapa semantik Direct3D 10 dan yang lebih baru memetakan langsung ke semantik Direct3D 9.
Direct3D 10 Semantik | Semantik Setara Direct3D 9 |
---|---|
SV_Depth | KEDALAMAN |
SV_Position | POSITION |
SV_Target | WARNA |
[!] Catatan untuk pengembang Direct3D 9: Untuk target Direct3D 9, semantik shader harus memetakan ke semantik Direct3D 9 yang valid. Untuk kompatibilitas mundur, FXC memperlakukan POSITION0 (dan nama variannya) sebagai SV_Position. FXC memperlakukan COLOR sebagai SV_TARGET. DXC dan pengkompilasi yang lebih baru menganggap POSITION[n] dan COLOR sebagai semantik yang ditentukan pengguna.
- Pemetaan ke Semantik Direct3D 9
- Direct3D 9 VPOS dan Direct3D 10 SV_Position
- Bidang klip pengguna di HLSL
Direct3D 9 VPOS dan Direct3D 10 SV_Position
SV_Position semantik D3D10 menyediakan fungsionalitas serupa dengan semantik VPOS model shader Direct3D 9 3. Misalnya, dalam Direct3D 9 sintaks berikut digunakan untuk shader piksel menggunakan koordinat ruang layar:
float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
// code here
}
VPOS ditambahkan untuk dukungan model shader 3, untuk menentukan koordinat ruang layar, karena semantik POSISI ditujukan untuk koordinat ruang objek.
Di Direct3D 10 dan yang lebih baru, semantik SV_Position (saat digunakan dalam konteks shader piksel) menentukan koordinat ruang layar (diimbangi 0,5). Oleh karena itu, shader Direct3D 9 akan kira-kira setara (tanpa memperhitungkan offset 0,5) dengan yang berikut:
float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
// code here
}
Saat bermigrasi dari Direct3D 9 ke Direct3D 10 dan yang lebih baru, Anda harus mengetahui hal ini saat menerjemahkan shader Anda.
Bidang klip pengguna di HLSL
Dimulai dengan Windows 8, Anda dapat menggunakan atribut fungsi clipplanes dalam deklarasi fungsi HLSL daripada SV_ClipDistance untuk membuat shader Anda berfungsi pada tingkat fitur 9_x serta tingkat fitur 10 dan yang lebih tinggi. Untuk informasi selengkapnya, lihat Bidang klip pengguna pada perangkat keras tingkat fitur 9.
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk