(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。 此函数处理压缩图面和未压缩图面的压缩。
相关主题