c++ - D3DXCreateTextureFromFile 不创建纹理
问题描述
D3DXCreateTextureFromFile 对我不起作用,当我使用 XorString 时出现 D3DXERR_INVALIDDATA 错误,而当我不使用时出现 D3DERR_INVALIDCALL 错误。
if (Globals::User::g_pAvatar == nullptr)
{
auto s_avatarFile = Globals::g_sAppdataFolder + "\\avatar.jpg";
auto avatarFile = s_avatarFile.c_str();
if (!fileExists(avatarFile))
{
download(Globals::User::g_sAvatarUrl.c_str(), avatarFile);
D3DXCreateTextureFromFile(Globals::g_pD3DDevice, XorStr(avatarFile), Globals::User::g_pAvatar);
}
else if (fileExists(avatarFile)) {
HRESULT hr = D3DXCreateTextureFromFile(Globals::g_pD3DDevice, XorStr(avatarFile), Globals::User::g_pAvatar);
switch (hr) {
case D3D_OK:
break;
case D3DERR_NOTAVAILABLE:
MessageBox(0, "D3DERR_NOTAVAILABLE", "dx9", MB_OKCANCEL | MB_ICONHAND);
break;
case D3DERR_OUTOFVIDEOMEMORY:
MessageBox(0, "D3DERR_OUTOFVIDEOMEMORY", "dx9", MB_OKCANCEL | MB_ICONHAND);
break;
case D3DERR_INVALIDCALL:
MessageBox(0, "D3DERR_INVALIDCALL", "dx9", MB_OKCANCEL | MB_ICONHAND);
break;
case D3DXERR_INVALIDDATA:
MessageBox(0, "D3DXERR_INVALIDDATA", "dx9", MB_OKCANCEL | MB_ICONHAND);
break;
case E_OUTOFMEMORY:
MessageBox(0, "E_OUTOFMEMORY", "dx9", MB_OKCANCEL | MB_ICONHAND);
break;
}
}
}
解决方案
D3DX9 库非常古老,它使用文件扩展名来确定使用哪个编解码器来加载图像。既然你告诉它jpg
它只会尝试使用 jpeglib 加载它。
D3DX10 和 D3DX11 库使用依赖于文件检查技术的 Windows 映像组件 ( WIC ),因此它不会关心物理文件名是什么。您可以在这里找到适用于旧版 DX9 的现代 DDSTextureLoader、WICTextureLoader 和 ScreenGrab,它们根本不需要 D3DX9。
D3DX9 包括 BMP、JPG、PNG、TGA、HDR 和 PPM/PFM 的编解码器。通过 WIC 的 D3DX10/D3DX11 支持 BMP、GIF、JPG、PNG、TIFF 和 HDPhoto (JPEG-XR)。它们都包括对 DDS 的支持。
DirectXTex包括用于 TGA 和 HDR 的编解码器,因为它们是常见的源纹理格式,但不受任何内置 WIC 编解码器的支持。HDR 的 DirectXTex 实现同时识别
?RADIANCE
和?RGBE
标头,但仅支持 D3DX9?RADIANCE
。请注意,D3DX9、D3DX10 和 D3DX11连同 DirectX SDK 本身都已弃用(请参阅Microsoft 文档)。
推荐阅读
- ios - 无法单击自定义 UICollectionViewCell 内容
- node.js - 使用 multer 发送状态和文件
- tensorflow - Tensorflow - 训练亚当
- c - 什么是形式参数中的默认存储类
- azure - 如何在 VSTS 中部署 azure 函数应用代码和 ARM 模板
- r - 什么是 dplyr rowwise() 的 Plyr 版本
- azure - 如何使用 Terraform 将 VM 添加到 Azure 中的负载均衡器?
- sql - 我不知道如何创建这个 sql 查询
- php - 格式化 PHP 数组以生成 JSON 数组,而不是对象
- mysql - 按列 id 选择行,如果为 null,则包括包含另一列中相同值的行