CreateWICTextureFromFile returns E_NOINTERFACE
CreateWICTextureFromFile returns E_NOINTERFACE
我想创建一个纹理加载器。
但是,当我创建以下行时:
HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0);
它 returns E_NOINTERFACE
。
我要加载的文件确实存在并且 ID3D11Device
和 ID3D11DeviceContext
都已成功创建。
这是我的 class 声明:
using std::wstring;
using Microsoft::WRL::ComPtr;
using DirectX::CreateWICTextureFromFile;
class Texture2DHandle {
private:
ComPtr<ID3D11Texture2D> texture;
ComPtr<ID3D11ShaderResourceView> shaderResourceView;
public:
Texture2DHandle() = default;
Texture2DHandle(void* data, int w, int h, DXGI_FORMAT format, ID3D11Device* device);
Texture2DHandle(wstring file, ID3D11Device* device, ID3D11DeviceContext* context);
ID3D11Texture2D* tex() const;
ID3D11ShaderResourceView* srv() const;
};
这里是构造函数的定义:
Texture2DHandle::Texture2DHandle(wstring file, ID3D11Device* device,ID3D11DeviceContext* context)
{
ComPtr<ID3D11Resource> resource;
HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0);
if (FAILED(res))
throw std::exception("Could not load texture from file!");
res = resource.As<ID3D11Texture2D>(&texture);
if (FAILED(res))
throw std::exception("Could not load texture from file!");
}
我不知道 E_NOINTERFACE
是什么意思,因为 Device 和 DeviceContext 都存在
确保您已初始化 COM,因为这是最有可能的问题。
#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)
Microsoft::WRL::Wrappers::RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
if (FAILED(initialize))
// error
#else
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (FAILED(hr))
// error
#endif
有关详细文档,请参阅 WICTextureLoader。
我想创建一个纹理加载器。 但是,当我创建以下行时:
HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0);
它 returns E_NOINTERFACE
。
我要加载的文件确实存在并且 ID3D11Device
和 ID3D11DeviceContext
都已成功创建。
这是我的 class 声明:
using std::wstring;
using Microsoft::WRL::ComPtr;
using DirectX::CreateWICTextureFromFile;
class Texture2DHandle {
private:
ComPtr<ID3D11Texture2D> texture;
ComPtr<ID3D11ShaderResourceView> shaderResourceView;
public:
Texture2DHandle() = default;
Texture2DHandle(void* data, int w, int h, DXGI_FORMAT format, ID3D11Device* device);
Texture2DHandle(wstring file, ID3D11Device* device, ID3D11DeviceContext* context);
ID3D11Texture2D* tex() const;
ID3D11ShaderResourceView* srv() const;
};
这里是构造函数的定义:
Texture2DHandle::Texture2DHandle(wstring file, ID3D11Device* device,ID3D11DeviceContext* context)
{
ComPtr<ID3D11Resource> resource;
HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0);
if (FAILED(res))
throw std::exception("Could not load texture from file!");
res = resource.As<ID3D11Texture2D>(&texture);
if (FAILED(res))
throw std::exception("Could not load texture from file!");
}
我不知道 E_NOINTERFACE
是什么意思,因为 Device 和 DeviceContext 都存在
确保您已初始化 COM,因为这是最有可能的问题。
#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)
Microsoft::WRL::Wrappers::RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
if (FAILED(initialize))
// error
#else
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (FAILED(hr))
// error
#endif
有关详细文档,请参阅 WICTextureLoader。