texm3x3spec - ps
Executa uma multiplicação de matriz 3x3 e usa o resultado para executar uma pesquisa de textura. Isso pode ser usado para reflexão especular e mapeamento de ambiente. texm3x3spec deve ser usado em conjunto com dois texm3x3pad – instruções ps .
Sintaxe
texm3x3spec dst, src0, src1 |
---|
onde
- dst é o registro de destino.
- src0 e src1 são registros de origem.
Comentários
Versões do sombreador de pixel | 1_1 | 1_2 | 1_3 | 1_4 | 2_0 | 2_x | 2_sw | 3_0 | 3_sw |
---|---|---|---|---|---|---|---|---|---|
texm3x3spec | x | x | x |
Esta instrução executa a linha final de uma multiplicação de matriz 3x3, usa o vetor resultante como um vetor normal para refletir um vetor de raios oculares e, em seguida, usa o vetor refletido para executar uma pesquisa de textura. O sombreador lê o vetor de raios oculares de um registro constante. A multiplicação de matriz 3x3 normalmente é útil para orientar um vetor normal para o espaço tangente correto para a superfície que está sendo renderizada.
A matriz 3x3 é composta pelas coordenadas de textura do terceiro estágio de textura e dos dois estágios de textura anteriores. O vetor pós-reflexão resultante (u,v,w) é usado para amostrar a textura no estágio de textura final. Qualquer textura atribuída aos dois estágios de textura anteriores é ignorada.
Esta instrução deve ser usada com duas instruções texm3x3pad. Os registros de textura devem usar a sequência a seguir.
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
A primeira instrução texm3x3pad executa a primeira linha da multiplicação para localizar u'.
u' = TextureCoordinates(stage m)UVW * t(n)RGB
A segunda instrução texm3x3pad executa a segunda linha da multiplicação para localizar v'.
v' = TextureCoordinates(stage m+1)UVW * t(n)RGB
A instrução texm3x3spec executa a terceira linha da multiplicação para localizar w'.
w' = TextureCoordinates(stage m+2)UVW * t(n)RGB
Em seguida, a instrução texm3x3spec faz um cálculo de reflexão.
(u' , v' , w' ) = 2*[(N*E)/(N*N)]*N - E
em que o N normal é dado por
N = (u' , v' , w' )
e o vetor de raios oculares E é dado pelo registro constante
E = c# (Qualquer registro constante--c0, c1, c2 etc.-- pode ser usado)
Por fim, a instrução texm3x3spec amostra t(m+2) com (u',v',w') e armazena o resultado em t(m+2).
t(m+2)RGBA = TextureSample(stage m+2)RGBA usando (u' , v' , w' ) como coordenadas
Exemplos
Aqui está um sombreador de exemplo com os mapas de textura e os estágios de textura identificados.
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
Este exemplo requer a configuração do estágio de textura a seguir.
- A fase 0 recebe um mapa de textura com dados normais. Isso geralmente é chamado de mapa de colisão. Os dados são normais (XYZ) para cada texel. As coordenadas de textura no estágio n definem onde amostrar esse mapa normal.
- O conjunto de coordenadas de textura m é atribuído à linha 1 da matriz 3x3. Qualquer textura atribuída ao estágio m é ignorada.
- O conjunto de coordenadas de textura m+1 é atribuído à linha 2 da matriz 3x3. Qualquer textura atribuída ao estágio m+1 é ignorada.
- O conjunto de coordenadas de textura m+2 é atribuído à linha 3 da matriz 3x3. O estágio m+2 recebe um mapa de textura de volume ou cubo. A textura fornece dados de cor (RGBA).
- O vetor de raios oculares E é dado por um registro constante E = c#.
Tópicos relacionados