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 dilewati di antara tahap shader. Sintaks untuk menambahkan semantik ke variabel shader ditunjukkan di sini (Sintaks Variabel (DirectX HLSL)).

Secara umum, data yang diteruskan di antara tahap alur benar-benar umum 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 Vertex Shader

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] Indeks campuran 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 puncak 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 puncak harus menuliskan parameter dengan semantik ini. 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 Pemecah Piksel

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 primitif yang menghadap ke belakang. Nilai negatif menghadap ke belakang, sementara nilai positif menghadapi kamera.

Catatan:
Semantik ini tersedia dalam Direct3D 9 Shader Model 3.0. Untuk Direct3D 10 dan yang lebih baru, gunakan SV_IsFrontFace sebagai gantinya.


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 System-Value

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 menjadi input 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 shader geometri memasukkan 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 verteks 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 System-Value 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 yang jarak bidang terinterpolasinya = >0. Beberapa clip plane dapat diimplementasikan secara bersamaan, dengan mendeklarasikan beberapa komponen dari satu atau beberapa elemen vertex sebagai SV_ClipDistance. Nilai jarak klip dan isolasi gabungan paling banyak merupakan komponen D3D#_CLIP_OR_CULL_DISTANCE_COUNT di sebagian besar register 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 Vertex Element diberikan label ini, nilai-nilai ini masing-masing diasumsikan sebagai jarak yang ditandatangani float32 ke bidang. Primitif akan benar-benar dibuang jika jarak bidang untuk semua simpul dalam primitif adalah < 0. Beberapa bidang cull dapat digunakan secara bersamaan, dengan mendeklarasikan beberapa komponen dari satu atau beberapa elemen puncak sebagai SV_CullDistance. Nilai jarak klip dan isolasi gabungan paling banyak merupakan komponen D3D#_CLIP_OR_CULL_DISTANCE_COUNT di sebagian besar register 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 lebih tinggi.
Untuk SV_Coverage pada shader piksel, INPUT memerlukan ps_5_0 atau lebih tinggi.
uint
SV_Depth Data buffer kedalaman. Dapat ditulis dengan pixel shader. float
SV_DepthGreaterEqual Dalam shader piksel, memungkinkan output kedalaman, 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 output kedalaman, 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 untuk menghitung shader. (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 primitif geometri 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 Menentukan 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 System-Generated (Direct3D 10)). Tersedia untuk semua shader.
SV_IsFrontFace Menentukan apakah segitiga menghadap ke depan. Untuk garis dan titik, IsFrontFace memiliki nilai true. Pengecualian adalah garis yang digambar dari segitiga (mode wireframe), yang mengatur IsFrontFace dengan cara yang sama seperti rasterisasi segitiga dalam mode solid. Dapat ditulis oleh shader geometri, dan dibaca oleh shader piksel. bool
SV_OutputControlPointID Menentukan indeks ID titik kontrol yang dioperasikan oleh pemanggilan titik masuk utama shader lambung. Hanya dapat dibaca oleh shader lambung. uint
SV_Position Ketika SV_Position dinyatakan untuk input ke shader, 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 System-Generated (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 pada output shader geometri, dan menunjukkan poong 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 puncak terkemuka digunakan. Nilai ini juga menunjukkan ilis 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 pada shader 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 8 target render mana yang mungkin terikat untuk ditulis. Nilai tersedia untuk semua shader. float[2|3|4]
SV_TessFactor Menentukan jumlah tessellation di 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 System-Generated (Direct3D 10)). Tersedia sebagai input ke shader vertex saja. uint
SV_ViewportArrayIndex Indeks array viewport. Diterapkan pada 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 puncak utama digunakan.
Jika D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer adalah true, maka SV_ViewportArrayIndex diterapkan ke shader apa pun yang memberi makan rasterizer.
uint
SV_ShadingRate Mendefinisikan, 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:

  • Saat 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 Direct3D 9 Semantics

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 POSITION0 kompatibilitas mundur (dan nama variannya) diperlakukan sebagai SV_Position, COLOR diperlakukan sebagai SV_TARGET.

Direct3D 9 VPOS dan Direct3D 10 SV_Position

Semantik D3D10 SV_Position menyediakan fungsionalitas serupa dengan semantik Direct3D 9 shader model 3 VPOS. 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 dengan 0,5). Oleh karena itu, shader Direct3D 9 akan kira-kira setara (tanpa mempertanggungjawabkan 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.