未处理的异常@ ClearRenderTargetView()

时间:2013-01-23 02:53:55

标签: visual-c++ directx directx-11 direct3d11

所以,我使用Visual Studio 2012和“板载”Windows SDK 8,编写Direct3D11应用程序,我遇到了一个很大的问题。我有一个类在D3D11顶部处理所有初始化,设置和绘制调用。我实例化了一个应用程序类,该类正确地包含了D3D11驱动程序类的一个实例以及它需要知道的所有数据。

D3D11驱动程序类构造函数获取应用程序的主窗口句柄,并使用它将D3D挂钩到应用程序的主窗口中。它正确构造自身并返回它调用驱动主循环的app->run()的位置。

在主循环中,调用该驱动程序以简单地测试绘制一个空白的红色屏幕。观察调试信息,有问题的渲染目标是可操作的,用于将后备缓冲区从交换链绑定到管道。

renderTargetView IS NOT NULL。 HRESULT被验证为S_OK。

如果我尝试在D3D11驱动程序类构造函数中调用Draw函数,它可以工作。 不会在通话之间取消分配。

就像Application类的构造函数在run()函数之前没有完成一样,如果我尝试继续而没有退出几个“帧”前进,则清除的渲染目标的偏红色调显示。有人可以开导我吗?我的智慧结束了。

IT不是空的。 HRESULT被验证为S_OK。有报道称这在Windows 8中得到修复,而Win7 SDK仍然受到影响。谷歌没有产生任何有用的东西,大多数人忘记为OMGetRenderTargets创建渲染目标视图(保持为NULL)或intellisense-miss OMSetRenderTargets。

1 个答案:

答案 0 :(得分:3)

取消引用空指针时几乎完全删除未处理的异常。 ClearRenderTargetView()有效初始化(即时)上下文的实例方法,或

ID3D11DeviceContext::ClearRenderTargetView(...)

如果您没有犯下不初始化渲染目标视图或调用OMGetRenderTargets(...)而不是OMSetRenderTargets(...)的重大错误,我绝对肯定您的上下文为空。根据你的陈述,你明确否认犯了这些错误。

使用assert验证我的声明,您的上下文确实为NULL。因为它在你的驱动程序构造函数中工作,并且在它被用作应用程序类的成员时不会,所以你可能没有在你的驱动程序类中提供正确的复制赋值操作符,这就是为什么它会丢弃一个未处理的异常框,它初始化上下文,然后由于错过参考副本而不会持久化。当对象被初始化时,它是部分有效的,这就是为什么它一次有效。

这只是一个假设,我很确定,但由于你缺乏代码,我只能用我的想象力和逻辑。如果您需要进一步的帮助,请回报。