直接 X "Texture cannot be null"异常
Exception "Texture cannot be null" Direct X
我正在使用directx11和directxtk编码2D游戏。
我做了一个类框架,该框架初始化了为游戏显示的窗口和初始化Directx。这些初始化正常工作。然后,我决定在窗口中绘制一些背景等,但是过了一段时间后,它出于例外而退出。我尝试了一个尝试{...} catch(){}块,它告诉我"纹理不能无效"。但是,我找不到它在谈论哪种纹理,即使通过删除和检查所有值。
我决定将我在窗口中绘制的不同元素分开,以查看问题可能来自何处...所以现在我有3种绘制方法:
Draw(DWORD &elapsedTime);
DrawBackground(DWORD &elapsedTime);
DrawCharacter(DWORD &elapsedTime);
draw(dword& elapsedtime)方法调用dabbackground()和drawcharacter()方法。
这是我的抽奖方法:
void Framework::Draw(DWORD * elapsedTime)
{
// Clearing the Back Buffer
immediateContext->ClearRenderTargetView(renderTargetView, Colors::Aquamarine);
//Clearing the depth buffer to max depth (1.0)
immediateContext->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); //immediateContext is a ID3D11DeviceContext*
CommonStates states(d3dDevice); //d3dDevice is a ID3D11Device*
sprites.reset(new SpriteBatch(immediateContext));
sprites->Begin(SpriteSortMode_Deferred, states.NonPremultiplied());
DrawBackground1(elapsedTime);
DrawCharacter(elapsedTime);
sprites->End();
//Presenting the back buffer to the front buffer
swapChain->Present(0, 0);
}
通过调试,我几乎可以确定该异常来自缺点()和drawcharacter()。的确,当我在抽奖方法中评论这些问题时,我没有错误,但是一旦我提出了几秒钟内显示我想要的东西,就会设定例外。
这是方法缩写()例如:
void Framework::DrawBackground1(DWORD * elpasedTime)
{
RECT *try1 = new RECT();
try1->bottom = 0; try1->left = 0; try1->right = (int)WIDTH; try1->bottom = (int)HEIGHT;
ID3D11ShaderResourceView * texture2 = nullptr;
ID3D11ShaderResourceView * textureRV = nullptr;
CreateDDSTextureFromFile(d3dDevice, L"../Images/backgrounds/set2_background.dds", nullptr, &textureRV);
CreateDDSTextureFromFile(d3dDevice, L"../Images/backgrounds/set3_tiles.dds", nullptr, &texture2);
sprites->Draw(textureRV, XMFLOAT2(0, 0), try1, Colors::White);
sprites->Draw(texture2, XMFLOAT2(0, 0), try1, Colors::CornflowerBlue);
}
因此,一旦我删除此方法(或任何遵循相同步骤的drawcharcter()),窗口会显示我期望的几秒钟,但随后我得到了例外的"纹理不能为null"。我还注意到,方法drawcharacter()让窗口显示我想要的内容比方法缩写()(),其纹理比角色的纹理大。
我不确定此信息是否有用,但是我认为这可能与纹理的大小相关联?
您会注意到我在此代码中做错了什么?为什么在显示一段时间时会将纹理视为null?我一直在寻找答案,已经有几个小时了,请提供一些帮助!谢谢
我注意到您创建了两个新的ID3D11shaderResourceView,而无需释放旧的ITERITION。您可以尝试仅创建ShaderResourceViews一次,然后将它们存储为全局变量,也可以在Sprites-> draw(...)调用之后尝试 -> Release()它们。
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- 使用 curl_easy_cleanup(curl) 时收到未经处理的 NULL 异常
- 直接 X "Texture cannot be null"异常
- 在Linux/GCC下,将NULL指针访问转换为C++异常
- 当我使用 opencv 函数 cvNorm(image,NULL,CV_L2)时,它会返回异常结果,为什么
- 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常
- Null指针异常(int Vs char)
- 本机插件Null异常OSX
- 添加printf语句时,NULL指针异常消失
- 在用C++编写的COM客户端中引发异常的Null返回值
- 在C++中抛出异常或返回NULL对象
- 静态库调用错误:异常:"A null reference pointer was passed to the stub."(使用 winsock2 Win32)