Share via


texm3x3spec – ps

Führt eine 3x3-Matrix multiplizieren aus und verwendet das Ergebnis, um eine Textursuche durchzuführen. Dies kann für die Spiegelung und Umgebungszuordnung verwendet werden. texm3x3spec muss in Verbindung mit zwei texm3x3pad - ps-Anweisungen verwendet werden.

Syntax

texm3x3spec dst, src0, src1

 

where

  • dst ist das Zielregister.
  • src0 und src1 sind Quellregister.

Bemerkungen

Pixelshaderversionen 1_1 1_2 1_3 1_4 2_0 2_x 2_sw 3_0 3_sw
texm3x3spec x x x

 

Diese Anweisung führt die letzte Zeile einer 3x3-Matrix multiplizieren, verwendet den resultierenden Vektor als Normalvektor, um einen Augenstrahlvektor widerzuspiegeln, und verwendet dann den reflektierten Vektor, um eine Textursuche durchzuführen. Der Shader liest den Eye-Ray-Vektor aus einem konstanten Register. Die 3x3-Matrix multiplizieren ist in der Regel nützlich, um einen normalen Vektor auf den richtigen Tangensraum für die gerenderte Oberfläche auszurichten.

Die 3x3-Matrix besteht aus den Texturkoordinaten der dritten Texturstufe und den beiden vorangehenden Texturstufen. Der resultierende Postreflektionsvektor (u, v, w) wird verwendet, um die Textur in der letzten Texturphase zu probieren. Jede Textur, die den beiden vorherigen Texturphasen zugewiesen ist, wird ignoriert.

Diese Anweisung muss mit zwei texm3x3pad-Anweisungen verwendet werden. Texturregister müssen die folgende Sequenz verwenden.

 
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

Die erste texm3x3pad-Anweisung führt die erste Zeile der Multiplikation durch, um u' zu finden.

u' = TextureCoordinates(stage m)UVW * t(n)RGB

Die zweite texm3x3pad-Anweisung führt die zweite Zeile der Multiplikation aus, um v' zu finden.

v' = TextureCoordinates(stage m+1)UVW * t(n)RGB

Die texm3x3spec-Anweisung führt die dritte Zeile der Multiplikation durch, um w' zu finden.

w' = TextureCoordinates(stage m+2)UVW * t(n)RGB

Die texm3x3spec-Anweisung führt dann eine Reflexionsberechnung durch.

(u' , v' , w' ) = 2*[(N*E)/(N*N)]*N - E

, wobei das normale N durch

N = (u' , v' , w' )

und der Augenstrahlvektor E wird durch das konstante Register angegeben.

E = c# (Beliebiges Konstantenregister kann verwendet werden– c0, c1, c2 usw.--)

Schließlich wird in der texm3x3spec-Anweisung t(m+2) mit (u',v',w') und das Ergebnis in t(m+2) gespeichert.

t(m+2)RGBA = TextureSample(stage m+2)RGBA using (u' , v' , w' ) als Koordinaten

Beispiele

Hier ist ein Beispielshader mit den Texturzuordnungen und den identifizierten Texturphasen.

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

Für dieses Beispiel ist das folgende Setup der Texturphase erforderlich.

  • Phase 0 wird eine Texturkarte mit normalen Daten zugewiesen. Dies wird häufig als Bump map bezeichnet. Die Daten sind (XYZ) normal für jeden Texel. Texturkoordinaten in Phase n definieren, wo diese normale Karte entnommen werden soll.
  • Der Texturkoordinatensatz m wird Zeile 1 der 3x3-Matrix zugewiesen. Jede Der Stufe m zugewiesene Textur wird ignoriert.
  • Der Texturkoordinatensatz m+1 wird Zeile 2 der 3x3-Matrix zugewiesen. Jede Textur, die der Phase m+1 zugewiesen ist, wird ignoriert.
  • Der Texturkoordinatensatz m+2 wird Zeile 3 der 3x3-Matrix zugewiesen. Der Phase m+2 wird eine Volume- oder Cubetexturzuordnung zugewiesen. Die Textur stellt Farbdaten (RGBA) bereit.
  • Der Augenstrahlvektor E wird durch ein konstantes Register E = c# angegeben.

Pixelshaderanweisungen