我正在使用Visual Studio 2019中的d3d11库编写一个简单的渲染器,它可以正常运行。但是,当我尝试运行Graphics Debugger时,它立即引发对地址0x0000000000000000的读取访问冲突(这显然是不正确的)。
从行上的DXCaptureReplay dll抛出异常
DeviceContext.PSSetShader(InShaderToBind.Shader.PS, NULL, 1);
其中InShaderToBind.Shader.PS是指向ID3D11PixelShader的指针
当我出于缺乏思想尝试而感到最奇怪的时候
int X = 0;
ID3D11ClassInstance* FakedClassInstance = reinterpret_cast<ID3D11ClassInstance*>(&X);
DeviceContext.PSSetShader(InShaderToBind.Shader.PS, &FakedClassInstance, 1);
因为这将使异常不会抛出,直到我尝试捕获一个帧为止(我认为这是有意义的,因为该指针仅对X仍然有效的范围才是有效的)]
MSDN文档指出,NULL应该是传递给PSSetShader的完全有效的参数(如此处所述:https://docs.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-pssetshader]
关于可能出什么问题的任何想法?
((如果我注释掉PSSetShader,则不会引发异常,并且可以进行捕获)
如果启用了Direct3D调试设备,您将在调试输出窗口中看到:
D3D11 CORRUPTION: ID3D11DeviceContext::PSSetShader: Second parameter (ppClassInstances) corrupt or unexpectedly NULL. [ MISCELLANEOUS CORRUPTION #14: CORRUPTED_PARAMETER2]
如果NumClassInstances为0,对于NULL
only,nullptr
(或更好的是ppClassInstances
)很好。尝试:
DeviceContext.PSSetShader(InShaderToBind.Shader.PS, NULL, 0);
通常,在尝试使用PIX或VSGS工具之前,您应确保程序运行时不会从调试层发出ERROR或CORRUPTION消息。