Bidang klip pengguna pada perangkat keras tingkat fitur 9

Dimulai dengan Windows 8, Microsoft High Level Shader Language (HLSL) mendukung sintaks yang dapat Anda gunakan dengan API Microsoft Direct3D 11 untuk menentukan bidang klip pengguna pada tingkat fitur 9_x dan yang lebih tinggi. Anda dapat menggunakan sintaks clip-planes ini untuk menulis shader, lalu menggunakan objek shader tersebut dengan API Direct3D 11 untuk berjalan di semua tingkat fitur Direct3D.

Background

Anda dapat mengakses bidang klip pengguna di API Microsoft Direct3D 9 melalui metode IDirect3DDevice9::SetClipPlane dan IDirect3DDevice9::GetClipPlane . Di Microsoft Direct3D 10 dan yang lebih baru, Anda dapat mengakses clip plane pengguna melalui semantik SV_ClipDistance . Tetapi sebelum Windows 8, SV_ClipDistance tidak tersedia untuk tingkat fitur 9_x perangkat keras di API Direct3D 10 atau Direct3D 11. Jadi, sebelum Windows 8, satu-satunya cara untuk mengakses bidang klip pengguna dengan tingkat fitur 9_x perangkat keras adalah melalui API Direct3D 9. Aplikasi Direct3D Windows Store tidak dapat menggunakan API Direct3D 9. Di sini kami menjelaskan sintaks yang dapat Anda gunakan untuk mengakses bidang klip pengguna melalui API Direct3D 11 pada tingkat fitur 9_x dan yang lebih tinggi.

Aplikasi menggunakan clip plane untuk menentukan satu set bidang yang tidak terlihat dalam dunia 3D yang mengklip (membuang) semua primitif yang digambar. Windows tidak akan menggambar piksel apa pun yang berada di sisi negatif dari bidang klip apa pun. Aplikasi kemudian dapat menggunakan clip plane untuk merender pantulan planar.

Sintaks

Gunakan sintaks ini untuk mendeklarasikan bidang klip sebagai atribut fungsi dalam deklarasi fungsi. Misalnya, di sini kita menggunakan sintaks pada fragmen shader vertex:

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

Contoh untuk fragmen shader vertex ini menunjukkan dua bidang klip. Ini menunjukkan bahwa Anda perlu menempatkan atribut clipplanes baru dalam tanda kurung siku segera sebelum nilai pengembalian shader vertex. Dalam tanda kurung setelah atribut clipplanes , Anda menyediakan daftar hingga 6 konstanta float4 yang menentukan koefisien bidang untuk setiap bidang klip aktif. Contohnya juga menunjukkan bahwa Anda perlu membuat koefisien setiap bidang berada di buffer konstan.

Catatan

Tidak ada sintaksis yang tersedia untuk menonaktifkan bidang klip secara dinamis. Anda harus mengkompilasi ulang shader yang identik tanpa atribut clipplanes , atau aplikasi Anda dapat mengatur koefisien di buffer konstan anda ke nol sehingga bidang tidak lagi memengaruhi geometri apa pun.

 

Sintaks ini tersedia untuk target shader vertex 4.0 atau yang lebih baru, yang mencakup vs_4_0_level_9_1 dan vs_4_0_level_9_3.

Membuat bidang klip di ruang klip pada tingkat fitur 9 dan yang lebih tinggi

Di sini kami menunjukkan cara membuat clip plane di ruang klip pada tingkat fitur 9_x dan yang lebih tinggi.

Pembacaan latar belakang

"Pengantar Pemrograman Game 3D dengan DirectX 10" oleh Frank D. Luna menjelaskan latar belakang matematika grafis (bab 1, 2 dan 3) yang Anda butuhkan, dan berbagai ruang dan transformasi ruang yang terjadi di shader verteks (bagian 5.6 dan 5.8).

Tingkat fitur 10Level9

Di Direct3D 10 dan yang lebih baru, Anda dapat mengklip di ruang apa pun yang masuk akal, sering kali di ruang dunia atau ruang tampilan. Tetapi Direct3D 9 menggunakan ruang klip, yang merupakan ruang proyeksi pembagian pra perspektif. Vektor berada di ruang klip ketika shader vertex meneruskannya ke tahapan yang mengikuti dalam alur grafis.

Saat menulis aplikasi Windows Store, Anda harus menggunakan tingkat fitur 10Level9 (tingkat fitur 9_x) sehingga aplikasi dapat berjalan pada tingkat fitur 9_x dan perangkat keras yang lebih tinggi. Karena aplikasi Anda mendukung tingkat fitur 9_x dan yang lebih tinggi, Anda juga harus menggunakan kemampuan umum untuk menerapkan clip plane di clip space.

Saat Anda mengkompilasi shader vertex dengan vs_4_0_level_9_1 atau yang lebih baru, shader vertex tersebut dapat menggunakan atribut clipplanes . Objek Direct3D 10 atau yang lebih baru memiliki produk titik dari puncak yang dipancarkan yang berisi masing-masing konstanta global float4 yang ditentukan dalam atribut . Objek Direct3D 9 memiliki data meta yang cukup untuk menyebabkan runtime 10Level9 mengeluarkan panggilan yang sesuai ke IDirect3DDevice9::SetClipPlane.

Matematika bidang klip

Bidang klip didefinisikan oleh vektor dengan 4 komponen. Tiga komponen pertama mendefinisikan vektor x, y, z yang berasal dari asal di ruang yang ingin kita klip. Vektor ini menyiratkan bidang, tegak lurus dengan vektor dan berjalan melalui asal. Windows menyimpan semua piksel di sisi vektor bidang dan mengklip semua piksel di belakang bidang. Komponen forth w mendorong bidang kembali dan menyebabkan Windows lebih sedikit klip (negatif w menyebabkan Windows mengklip lebih banyak) di sepanjang garis vektor. Jika komponen x, y, z menyusun vektor unit (dinormalisasi), w mendorong unit w bidang kembali.

Matematika yang dilakukan unit pemrosesan grafis (GPU) untuk menentukan kliping adalah produk titik sederhana antara vektor puncak (x, y, z, 1) dan vektor bidang kliping. Operasi matematika ini membuat panjang proyeksi pada vektor clip plane. Produk titik negatif menunjukkan puncak berada di sisi bidang yang terpotong.

Mengklip di ruang tampilan

Berikut adalah puncak kami dalam ruang tampilan:

vertex dalam ruang tampilan

Berikut adalah clip plane kami di ruang tampilan:

bidang klip dalam ruang tampilan

Berikut adalah produk titik vertex dan clip plane di ruang tampilan:

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

Operasi matematika ini berfungsi untuk objek Direct3D 10 atau yang lebih baru tetapi tidak akan berfungsi untuk objek Direct3D 9. Untuk Direct3D 9, kita harus terlebih dahulu melewati transformasi proyeksi menjadi ruang klip.

Matriks proyeksi

Matriks proyeksi mengubah puncak dari ruang tampilan (di mana asalnya adalah mata penampil, +x ada di sebelah kanan, +y naik, dan +z lurus ke depan) menjadi ruang klip. Matriks proyeksi membaca puncak untuk kliping perangkat keras dan tahap rasterisasi. Berikut adalah matriks perspektif standar (proyeksi lain memerlukan matematika yang berbeda):

*r* rasio lebar/tinggi jendela *α* melihat sudut *f* jarak dari penampil ke bidang jauh *n* jarak dari penampil ke bidang dekat
! [Matriks proyeksi] (gambar/projection-matrix.png)

Matriks berikutnya adalah versi matriks sebelumnya yang disederhanakan. Kami menunjukkan matriks yang disederhanakan sehingga kami dapat menggunakannya nanti dalam operasi perkalian matriks.

Matriks proyeksi yang disederhanakan

Sekarang kita mengubah sudut ruang tampilan menjadi ruang klip dengan matriks mengalikan:

kalikan matriks

Dalam operasi perkalian matriks kami, komponen x dan y kami hanya sedikit disesuaikan, tetapi komponen z dan w kami cukup terganggu. Pesawat klip kita tidak akan memberikan apa yang kita inginkan lagi.

Clip space clip plane

Di sini kita ingin membuat clip space clip plane yang produk titiknya dengan vertex ruang klip kita memberi kita nilai yang sama dengan v · C di bagian Kliping di ruang tampilan .

bidang klip

v · C = v P · CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCPw

Sekarang kita dapat memecah operasi matematika sebelumnya dengan komponen puncak menjadi empat persamaan terpisah:

komponen x vertex dari produk clip plane

komponen vertex y dari produk clip plane

w komponen vertex dari produk clip plane

komponen puncak z dari produk clip plane

Pesawat klip ruang pandang kami dan matriks proyeksi kami berasal dan memberi kami clip plane ruang klip kami.

clip space clip plane

Panduan Pemrograman untuk HLSL

Sintaks Deklarasi Fungsi