Поделиться через


Использование сжатых текстур (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. Эта функция обрабатывает сжатие сжатых и несжатых поверхностей и из нее.

Сжатые ресурсы текстуры