Usando texturas compactadas (Direct3D 9)
Determinando o suporte para texturas compactadas
Para testar o adaptador, especifique qualquer formato de pixel que use DXT1, DXT2, DXT3, DXT4 ou DXT5. Se IDirect3D9::CheckDeviceFormat retornar D3D_OK, o dispositivo poderá criar textura diretamente de uma superfície de textura compactada que usa esse formato. Nesse caso, você pode usar superfícies de textura compactadas diretamente com Direct3D chamando o método IDirect3DDevice9::SetTexture . O exemplo de código a seguir mostra como determinar se o adaptador dá suporte a um formato de textura compactada.
BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat,
D3DFORMAT AdapterFormat )
{
HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
0,
D3DRTYPE_TEXTURE,
TextureFormat);
return SUCCEEDED( hr );
}
Se o dispositivo não der suporte à texturização de superfícies de textura compactadas, você ainda poderá armazenar dados de textura em uma superfície de formato compactado, mas deverá converter todas as texturas compactadas em um formato compatível antes que elas possam ser usadas para texturização.
Criando texturas compactadas
Depois de criar um dispositivo que dá suporte a um formato de textura compactado no adaptador, você pode criar um recurso de textura compactada. Chame IDirect3DDevice9::CreateTexture e especifique um formato de textura compactada para o parâmetro Format.
Antes de carregar uma imagem em um objeto de textura, recupere um ponteiro para a superfície de textura chamando o método IDirect3DTexture9::GetSurfaceLevel .
Agora você pode usar qualquer função D3DXLoadSurfacexxx para carregar uma imagem na superfície que foi recuperada usando IDirect3DTexture9::GetSurfaceLevel. Essas funções manipulam a conversão de e para formatos de textura compactados.
Você pode criar e converter arquivos DDS (textura compactada) usando o Editor de Textura DirectX (Dxtex.exe) fornecido com o SDK do DirectX. Você pode obter Dxtex.exe e aprender sobre isso no SDK do DirectX. Para obter informações sobre o SDK do DirectX, consulte Onde está o SDK do DirectX?.
A vantagem desse comportamento é que um aplicativo pode copiar o conteúdo de uma superfície compactada para um arquivo sem calcular quanto armazenamento é necessário para uma superfície de uma largura e altura específicas no formato específico.
A tabela a seguir mostra os cinco tipos de texturas compactadas. Para obter mais informações sobre como os dados são armazenados, consulte Formatos de textura compactados (Direct3D 9). Você só precisará dessas informações se estiver escrevendo suas próprias rotinas de compactação.
FOURCC | Descrição | Alfa pré-multiplicado? |
---|---|---|
DXT1 | Alfa opaco/de 1 bit | N/D |
DXT2 | Alfa explícito | Yes |
DXT3 | Alfa explícito | Não |
DXT4 | Alfa interpolado | Sim |
DXT5 | Alfa interpolado | Não |
Quando você transfere dados de um formato não pré-multiplicado para um formato pré-multiplicado, o Direct3D dimensiona as cores com base nos valores alfa. Não há suporte para a transferência de dados de um formato pré-multiplicado para um formato não pré-multiplicado. Se você tentar transferir dados de uma fonte alfa pré-multiplicada para um destino alfa não pré-multiplicado, o método retornará D3DERR_INVALIDCALL. Se você transferir dados de uma fonte alfa pré-multiplicada para um destino que não tem alfa, os componentes de cor de origem, que foram dimensionados por alfa, serão copiados como estão.
Descompactando superfícies de textura compactadas
Assim como acontece com a compactação de uma superfície de textura, a descompactação de uma textura compactada é executada por meio de serviços de cópia direct3D.
Para copiar uma superfície de textura compactada para uma superfície de textura descompactada, use a função D3DXLoadSurfaceFromSurface. Essas funções manipulam a compactação de e para superfícies compactadas e descompactadas.
Tópicos relacionados