首页 > 解决方案 > 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;
        }
    }
}

标签: c++directx-9

解决方案


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 文档)。


推荐阅读