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;
}
}
}
D3DX9库非常老,它使用文件名扩展名来确定用于加载图像的编解码器。由于您已告知jpg
,因此只会尝试使用jpeglib加载它。
D3DX10和D3DX11库使用Windows Imaging Component WIC,它依赖于文件检查技术,因此它不在乎物理文件名是什么。您可以找到完全不需要D3DX9的旧版DX9 here的现代DDSTextureLoader,WICTextureLoader和ScreenGrab。
注意,D3DX9,D3DX10和D3DX11均已弃用(请参见Microsoft Docs)。