Использование сжатых текстур (Direct3D 9)
Определение поддержки сжатых текстур
Чтобы протестировать адаптер, укажите любой формат пикселей, использующий DXT1, DXT2, DXT3, DXT4 или DXT5. Если IDirect3D9::CheckDeviceFormat возвращает D3D_OK, устройство может создавать текстуру непосредственно из сжатой поверхности текстуры, использующего этот формат. В этом случае сжатые поверхности текстур можно использовать непосредственно с Direct3D, вызвав метод IDirect3DDevice9::SetTexture . В следующем примере кода показано, как определить, поддерживает ли адаптер сжатый формат текстуры.
BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat,
D3DFORMAT AdapterFormat )
{
HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
0,
D3DRTYPE_TEXTURE,
TextureFormat);
return SUCCEEDED( hr );
}
Если устройство не поддерживает текстурирование из сжатых поверхностей текстур, вы по-прежнему можете хранить данные текстур в поверхности сжатого формата, но необходимо преобразовать все сжатые текстуры в поддерживаемый формат, прежде чем их можно будет использовать для текстурирования.
Создание сжатых текстур
После создания устройства, поддерживающего сжатый формат текстуры на адаптере, можно создать ресурс сжатой текстуры. Вызовите метод IDirect3DDevice9::CreateTexture и укажите сжатый формат текстуры для параметра Format.
Перед загрузкой изображения в объект текстуры получите указатель на поверхность текстуры, вызвав метод IDirect3DTexture9::GetSurfaceLevel .
Теперь можно использовать любую функцию D3DXLoadSurfacexxx, чтобы загрузить изображение на поверхность, полученное с помощью IDirect3DTexture9::GetSurfaceLevel. Эти функции обрабатывают преобразование в сжатые форматы текстур и из них.
Вы можете создавать и преобразовывать сжатые файлы текстур (DDS) с помощью редактора текстур DirectX (Dxtex.exe), поставляемого вместе с пакетом SDK для DirectX. Вы можете получить Dxtex.exe и узнать о нем из пакета SDK для DirectX. Сведения о пакете SDK для DirectX см. в разделе Где находится пакет SDK DirectX?.
Преимущество такого поведения заключается в том, что приложение может копировать содержимое сжатой поверхности в файл без вычисления объема хранилища, необходимого для поверхности определенной ширины и высоты в определенном формате.
В следующей таблице показаны пять типов сжатых текстур. Дополнительные сведения о том, как хранятся данные, см. в разделе Сжатые форматы текстур (Direct3D 9). Эта информация нужна только в том случае, если вы пишете собственные процедуры сжатия.
FOURCC | Описание | Альфа предварительно замедлилили? |
---|---|---|
DXT1 | Непрозрачный/1-разрядный альфа-канал | Н/Д |
DXT2 | Явное альфа-значение | Да |
DXT3 | Явное альфа-значение | Нет |
DXT4 | Интерполированная альфа-версия | Да |
DXT5 | Интерполированная альфа-версия | Нет |
При передаче данных из нерекомендуемого формата в предварительно заданный формат Direct3D масштабирует цвета на основе альфа-значений. Передача данных из предварительного формата в формат не поддерживается. При попытке передачи данных из предварительного источника альфа-канала в непреднаследованное назначение альфа-канала метод возвращает D3DERR_INVALIDCALL. При передаче данных из предварительно измененного источника альфа-канала в место назначения, в котором нет альфа-канала, компоненты цвета источника, масштабируемые с помощью альфа-канала, копируются как есть.
Распаковка сжатых поверхностей текстур
Как и при сжатии поверхности текстуры, распаковка сжатой текстуры выполняется с помощью служб копирования Direct3D.
Чтобы скопировать сжатую поверхность текстуры в несжатую поверхность текстуры, используйте функцию D3DXLoadSurfaceFromSurface. Эта функция обрабатывает сжатие сжатых и несжатых поверхностей и из нее.
Связанные темы