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

最新更新