我正在使用 Visual Studio 2019 中的 d3d11 库编写一个简单的渲染器,它构建和运行良好。但是,当我尝试运行图形调试器时,它立即引发地址 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]
NULL
(或更好nullptr
)ppClassInstances
仅当 NumClassInstances 为 0时才适用。尝试:
DeviceContext.PSSetShader(InShaderToBind.Shader.PS, NULL, 0);
通常,在尝试使用 PIX 或 VSGS 工具之前,您应该确保程序运行时不会从调试层发出 ERROR 或 CORRUPTION 消息。
请参阅Microsoft Docs和此博客文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句