Transformações de coordenadas de textura (Direct3D 9)
Os dispositivos Direct3D podem transformar as coordenadas de textura para vértices aplicando uma matriz 4x4. O sistema aplica transformações a coordenadas de textura da mesma maneira que a geometria. Qualquer transformação (escala, rotação, tradução, projeção, tesoura ou qualquer combinação delas) pode ser feita com uma matriz 4x4.
Observação
O Direct3D não modifica vértices transformados e acesos. Como resultado, um aplicativo que usa vértices transformados e iluminados não pode usar Direct3D para transformar as coordenadas de textura dos vértices.
Dispositivos que dão suporte a operações de transformação e iluminação aceleradas por hardware (dispositivo T&L HAL) também aceleram a transformação de coordenadas de textura. Quando a aceleração de hardware de transformações não está disponível, as otimizações específicas da plataforma no pipeline de geometria do Direct3D se aplicam a transformações de coordenadas de textura.
As transformações de coordenadas de textura são úteis para produzir efeitos especiais, evitando a necessidade de modificar diretamente as coordenadas de textura da geometria. Você pode usar matrizes de conversão ou rotação simples para animar texturas em um objeto ou transformar coordenadas de textura geradas automaticamente pelo Direct3D para simplificar e talvez acelerar efeitos avançados, como texturas projetadas e mapeamento dinâmico de luz. Além disso, você pode usar transformações de coordenadas de textura para reutilizar um único conjunto de coordenadas de textura para várias finalidades, em vários estágios de textura.
Definindo e recuperando transformações de coordenadas de textura
Assim como as matrizes que seu aplicativo usa para geometria, você define e recupera transformações de coordenadas de textura chamando os métodos IDirect3DDevice9::SetTransform e IDirect3DDevice9::GetTransform . Esses métodos aceitam a D3DTS_TEXTURE0 por meio de D3DTS_TEXTURE7 membros do tipo enumerado D3DTRANSFORMSTATETYPE para identificar as matrizes de transformação dos estágios de textura de 0 a 7, respectivamente.
O código a seguir define uma matriz a ser aplicada às coordenadas de textura para a fase de textura 0.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
D3DMATRIX matTrans = D3DXMatrixIdentity( NULL );
// Set up the matrix for the desired transformation.
d3dDevice->SetTransform( D3DTS_TEXTURE0, &matTrans );
Habilitando transformações de coordenadas de textura
O estado D3DTSS_TEXTURETRANSFORMFLAGS estágio de textura controla a aplicação de transformações de coordenadas de textura. Os valores para esse estado de estágio de textura são definidos pelo tipo enumerado D3DTEXTURETRANSFORMFLAGS .
As transformações de coordenadas de textura são desabilitadas quando D3DTSS_TEXTURETRANSFORMFLAGS é definido como D3DTTFF_DISABLE (o valor padrão). Supondo que as transformações de coordenadas de textura foram habilitadas para o estágio 0, o código a seguir as desabilita.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_DISABLE );
Os outros valores definidos em D3DTEXTURETRANSFORMFLAGS são usados para habilitar transformações de coordenadas de textura e para controlar quantos elementos de coordenadas de textura resultantes são passados para o rasterizador. Por exemplo, use o código a seguir.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2 );
O valor D3DTTFF_COUNT2 instrui o sistema a aplicar o conjunto de matrizes de transformação para o estágio de textura 0 e, em seguida, passar os dois primeiros elementos das coordenadas de textura modificadas para o rasterizador.
O sinalizador de transformação de textura D3DTTFF_PROJECTED indica coordenadas para uma textura projetada. Quando esse sinalizador é especificado, o rasterizador divide os elementos passados pelo último elemento. Veja o código a seguir, por exemplo.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT3 | D3DTTFF_PROJECTED );
Este exemplo informa ao sistema para passar três elementos de coordenadas de textura para o rasterizador. O rasterizador divide os dois primeiros elementos pelo terceiro, produzindo as coordenadas de textura 2D necessárias para lidar com a textura.
Tópicos relacionados