D3DXCreateTextureFromFile不会创建纹理

问题描述 投票:0回答:1

D3DXCreateTextureFromFile对我不起作用,当我不使用XorString和D3DERR_INVALIDCALL时,出现D3DXERR_INVALIDDATA错误。

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
1个回答
0
投票

D3DX9库非常老,它使用文件名扩展名来确定用于加载图像的编解码器。由于您已告知jpg,因此只会尝试使用jpeglib加载它。

D3DX10和D3DX11库使用Windows Imaging Component WIC,它依赖于文件检查技术,因此它不在乎物理文件名是什么。您可以找到完全不需要D3DX9的旧版DX9 here的现代DDSTextureLoader,WICTextureLoader和ScreenGrab。

注意,D3DX9,D3DX10和D3DX11均已弃用(请参见Microsoft Docs)。

© www.soinside.com 2019 - 2024. All rights reserved.