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


Использование сжатых текстур (Direct3D 9)

Определение поддержки сжатых текстур

Чтобы протестировать адаптер, укажите любой формат пикселей, использующий DXT1, DXT2, DXT3, DXT4 или DXT5. Если IDirect3D9::CheckDeviceFormat возвращает D3D_OK, устройство может создать текстуру непосредственно из сжатой поверхности текстуры, которая использует этот формат. Если это так, можно использовать сжатые поверхности текстуры непосредственно с Direct3D, вызвав метод IDirect3Device9::SetTexture. В следующем примере кода показано, поддерживает ли адаптер сжатый формат текстуры.

BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat, 
                                  D3DFORMAT AdapterFormat ) 
{
    HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
                                          D3DDEVTYPE_HAL,
                                          AdapterFormat,
                                          0,
                                          D3DRTYPE_TEXTURE,
                                          TextureFormat);

    return SUCCEEDED( hr );
}

Если устройство не поддерживает текстурирование из сжатых поверхностей текстур, вы по-прежнему можете хранить данные текстур в сжатой области форматирования, но необходимо преобразовать любые сжатые текстуры в поддерживаемый формат, прежде чем их можно будет использовать для текстурирования.

Создание сжатых текстур

После создания устройства, поддерживающего сжатый формат текстуры на адаптере, можно создать сжатый ресурс текстуры. Вызовите IDirect3Device9::CreateTexture и укажите сжатый формат текстуры для параметра Format.

Перед загрузкой изображения в объект текстуры получите указатель на поверхность текстуры, вызвав метод IDirect3DTexture9::GetSurfaceLevel.

Теперь можно использовать любую функцию D3DXLoadSurfacexxxx для загрузки изображения на поверхность, полученную с помощью IDirect3DTexture9::GetSurfaceLevel. Эти функции обрабатывают преобразование в и из сжатых форматов текстур.

Вы можете создавать и преобразовывать сжатые файлы текстур (DDS) с помощью редактора текстур DirectX (Dxtex.exe), предоставленного пакетом SDK DirectX. Вы можете получить Dxtex.exe из пакета DirectX SDK и узнать о нём. Дополнительные сведения о пакете SDK DirectX см. в разделе Где находится пакет SDK DirectX?.

Преимуществом этого поведения является то, что приложение может скопировать содержимое сжатой поверхности в файл, не вычисляя, сколько хранилища требуется для поверхности определенной ширины и высоты в определенном формате.

В следующей таблице показаны пять типов сжатых текстур. Для получения дополнительной информации о том, как хранятся данные, смотрите в разделе Сжатые форматы текстур (Direct3D 9). Эти сведения требуются только в том случае, если вы пишете собственные подпрограммы сжатия.

FOURCC Описание Предварительно умножена альфа?
DXT1 Непрозрачный и 1-разрядный альфа-канал N/A
DXT2 Явный альфа-канал Да
DXT3 Явный альфа-канал Нет
DXT4 Интерполированный альфа Да
DXT5 Интерполированный альфа Нет

 

При передаче данных из непремультиплицированного формата в премультиплицированный формат Direct3D масштабирует цвета, основываясь на альфа-значениях. Перенос данных из предварительно заданного формата в нерекоменданный формат не поддерживается. Если вы пытаетесь передать данные из предварительно умноженного альфа-источника в неумноженное альфа-назначение, метод возвращает D3DERR_INVALIDCALL. Если вы передаете данные из источника с предварительным умножением альфа в пункт назначения, в котором нет альфа, исходные компоненты цвета, которые были масштабированы альфа, копируются в неизменном виде.

Распаковка поверхностей сжатых текстур

Как и при сжатие поверхности текстуры, распаковка сжатой текстуры выполняется через службы копирования Direct3D.

Чтобы скопировать сжатые поверхности текстуры в несжатую поверхность текстуры, используйте функцию D3DXLoadSurfaceFromSurface. Эти функции обрабатывают сжатие в сжатые и несжатые поверхности.

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