texm3x3spec - ps
Melakukan perkalian matriks 3x3 dan menggunakan hasilnya untuk melakukan pencarian tekstur. Ini dapat digunakan untuk refleksi spekular dan pemetaan lingkungan. texm3x3spec harus digunakan bersama dengan dua texm3x3pad - instruksi ps .
Sintaks
texm3x3spec dst, src0, src1 |
---|
Di mana
- dst adalah register tujuan.
- src0 dan src1 adalah register sumber.
Keterangan
Versi shader piksel | 1_1 | 1_2 | 1_3 | 1_4 | 2_0 | 2_x | 2_sw | 3_0 | 3_sw |
---|---|---|---|---|---|---|---|---|---|
texm3x3spec | x | x | x |
Instruksi ini melakukan baris akhir perkalian matriks 3x3, menggunakan vektor yang dihasilkan sebagai vektor normal untuk mencerminkan vektor sinar mata, lalu menggunakan vektor yang tercermin untuk melakukan pencarian tekstur. Shader membaca vektor sinar mata dari register konstan. Perkalian matriks 3x3 biasanya berguna untuk mengorientasikan vektor normal ke ruang tangen yang benar untuk permukaan yang dirender.
Matriks 3x3 terdiri dari koordinat tekstur tahap tekstur ketiga dan dua tahap tekstur sebelumnya. Vektor refleksi pos yang dihasilkan (u,v,w) digunakan untuk mengambil sampel tekstur pada tahap tekstur akhir. Tekstur apa pun yang ditetapkan ke dua tahap tekstur sebelumnya diabaikan.
Instruksi ini harus digunakan dengan dua instruksi texm3x3pad. Register tekstur harus menggunakan urutan berikut.
tex t(n) // Define tn as a standard 3-vector (tn must
// be defined in some way before it is used)
texm3x3pad t(m), t(n) // where m > n
// Perform first row of matrix multiply
texm3x3pad t(m+1), t(n) // Perform second row of matrix multiply
texm3x3spec t(m+2), t(n), c0 // Perform third row of matrix multiply
// Then do a texture lookup on the texture
// associated with texture stage m+2
Instruksi texm3x3pad pertama melakukan baris pertama perkalian untuk menemukan u'.
u' = TextureCoordinates(stage m)UVW * t(n)RGB
Instruksi texm3x3pad kedua melakukan baris kedua dari perkalian untuk menemukan v'.
v' = TextureCoordinates(stage m+1)UVW * t(n)RGB
Instruksi texm3x3spec melakukan baris ketiga dari perkalian untuk menemukan w'.
w' = TextureCoordinates(stage m+2)UVW * t(n)RGB
Instruksi texm3x3spec kemudian melakukan perhitungan pantulan.
(u' , v' , w' ) = 2*[(N*E)/(N*N)]*N - E
di mana N normal diberikan oleh
N = (u' , v' , w' )
dan vektor sinar mata E diberikan oleh register konstanta
E = c# (Setiap register konstanta--c0, c1, c2, dll.--dapat digunakan)
Terakhir, sampel instruksi texm3x3spec t(m+2) dengan (u',v',w') dan menyimpan hasilnya dalam t(m+2).
t(m+2)RGBA = TextureSample(stage m+2)RGBA menggunakan (u' , v' , w' ) sebagai koordinat
Contoh
Berikut adalah contoh shader dengan peta tekstur dan tahap tekstur yang diidentifikasi.
ps_1_1
tex t0 // Bind texture in stage 0 to register t0 (tn must
// be defined in some way before it is used)
texm3x3pad t1, t0 // First row of matrix multiply
texm3x3pad t2, t0 // Second row of matrix multiply
texm3x3spec t3, t0, c# // Third row of matrix multiply to get a 3-vector
// Reflect 3-vector by the eye-ray vector in c#
// Use reflected vector to lookup texture in
// stage 3
mov r0, t3 // Output the result
Contoh ini memerlukan penyiapan tahap tekstur berikut.
- Tahap 0 diberi peta tekstur dengan data normal. Ini sering disebut sebagai peta benjolan. Data adalah (XYZ) normal untuk setiap texel. Koordinat tekstur pada tahap n menentukan tempat untuk mengambil sampel peta normal ini.
- Kumpulan koordinat tekstur m ditetapkan ke baris 1 dari matriks 3x3. Tekstur apa pun yang ditetapkan untuk tahap m diabaikan.
- Kumpulan koordinat tekstur m+1 ditetapkan ke baris 2 dari matriks 3x3. Tekstur apa pun yang ditetapkan ke tahap m+1 diabaikan.
- Kumpulan koordinat tekstur m+2 ditetapkan ke baris 3 dari matriks 3x3. Tahap m+2 diberi peta tekstur volume atau kubus. Tekstur menyediakan data warna (RGBA).
- Vektor sinar mata E diberikan oleh register konstan E = c#.
Topik terkait