所以,我使用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。
答案 0 :(得分:3)
取消引用空指针时几乎完全删除未处理的异常。 ClearRenderTargetView()
是有效初始化(即时)上下文的实例方法,或
ID3D11DeviceContext::ClearRenderTargetView(...)
如果您没有犯下不初始化渲染目标视图或调用OMGetRenderTargets(...)
而不是OMSetRenderTargets(...)
的重大错误,我绝对肯定您的上下文为空。根据你的陈述,你明确否认犯了这些错误。
使用assert
验证我的声明,您的上下文确实为NULL。因为它在你的驱动程序构造函数中工作,并且在它被用作应用程序类的成员时不会,所以你可能没有在你的驱动程序类中提供正确的复制赋值操作符,这就是为什么它会丢弃一个未处理的异常框,它初始化上下文,然后由于错过参考副本而不会持久化。当对象被初始化时,它是部分有效的,这就是为什么它一次有效。
这只是一个假设,我很确定,但由于你缺乏代码,我只能用我的想象力和逻辑。如果您需要进一步的帮助,请回报。