0

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

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

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

renderTargetView 不为空。HRESULT 被验证为 S_OK。

如果我尝试在 D3D11 驱动程序类构造函数中调用 Draw 函数,它可以工作。它不会在调用之间被释放。

就像 Application 类的构造函数在 run() 函数之前没有完成一样,如果我尝试继续而不退出几个“帧”向前,则清除的渲染目标会显示为红色。有人可以启发我吗?我已经走投无路了。

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

4

1 回答 1

3

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

ID3D11DeviceContext::ClearRenderTargetView(...)

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

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

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

于 2013-01-24T03:11:02.753 回答