(Direct3D 9) 使用压缩纹理

确定对压缩纹理的支持

若要测试适配器,请指定使用 DXT1、DXT2、DXT3、DXT4 或 DXT5 的任何像素格式。 如果 IDirect3D9::CheckDeviceFormat 返回D3D_OK,则设备可以直接从使用该格式的压缩纹理图面创建纹理。 如果是这样,可以通过调用 IDirect3DDevice9::SetTexture 方法直接将压缩纹理图面与 Direct3D 配合使用。 下面的代码示例演示如何确定适配器是否支持压缩纹理格式。

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 检索到的表面。 这些函数处理与压缩纹理格式的转换。

可以使用 DirectX SDK 随附的 DirectX 纹理编辑器 (Dxtex.exe) 创建和转换 (DDS) 文件的压缩纹理。 可以从 DirectX SDK 获取Dxtex.exe并了解它。 有关 DirectX SDK 的信息,请参阅 DirectX SDK 在哪里?

此行为的优点是,应用程序可以将压缩图面的内容复制到文件,而无需计算特定格式的特定宽度和高度的图面所需的存储量。

下表显示了五种类型的压缩纹理。 有关如何存储数据的详细信息,请参阅压缩 纹理格式 (Direct3D 9) 。 只有在编写自己的压缩例程时,才需要此信息。

FOURCC 说明 Alpha 预乘?
DXT1 不透明/1 位 alpha 空值
DXT2 显式 alpha
DXT3 显式 alpha
DXT4 内插 alpha
DXT5 内插 alpha

 

将数据从非多乘格式传输到预乘格式时,Direct3D 会根据 alpha 值缩放颜色。 不支持将数据从预乘格式传输到非多乘格式。 如果尝试将数据从预乘的 alpha 源传输到非多乘 alpha 目标,该方法将返回D3DERR_INVALIDCALL。 如果将数据从预乘的 alpha 源传输到没有 alpha 的目标,则按原样复制已按 alpha 缩放的源颜色分量。

解压缩压缩纹理图面

与压缩纹理表面一样,解压缩压缩的纹理是通过 Direct3D 复制服务执行的。

若要将压缩的纹理图面复制到未压缩的纹理图面,请使用函数 D3DXLoadSurfaceFromSurface。 此函数处理压缩图面和未压缩图面的压缩。

压缩的纹理资源