7

我不知道你们中是否有很多人尝试过 Visual Studio 2012 新的出色功能来调试基于 Direct3D 的应用程序。

我成功捕获了我的应用程序的一帧,然后我想调试顶点着色器的执行: 在此处输入图像描述

我单击绿色三角形来调试给定的顶点,但我收到“未找到符号”消息,阻止我对其进行调试。

有人知道如何让 Visual Studio 找到符号吗?

谢谢。

4

4 回答 4

4

您需要使用调试信息编译着色器。为了可靠地调试,您可能还希望禁用优化。根据您编译着色器的方式,这将是以下两种方式之一:

D3DCompile / D3DCompileFromFile:D3DCOMPILE_DEBUGD3DCOMPILE_SKIP_OPTIMIZATION标志传递给 D3DCompile。请注意,根据 D3D 版本以及您是否使用 D3DX,这些标志可能具有不同的前缀。

fxc.exe:编译标志具有开关等效项。对于D3DCOMPILE_DEBUG,传递/Zi给 fxc。为D3DCOMPILE_SKIP_OPTIMIZATION,通过/Od

Visual Studio 2012 非常聪明地根据嵌入的调试信息查找着色器的源,但如果它无法做到这一点,它会提示您指向适当的文件。

于 2013-10-01T16:28:12.543 回答
3

来自msdn

无法同时调试应用程序及其着色器代码。但是,您可以在它们之间交替

您可能正在调试应用程序并尝试同时调试着色器。

于 2013-02-07T11:35:14.323 回答
3

使用 SlimDX 时,您可以传递ShaderFlags给着色器编译器。传递ShaderFlags.Debug会导致包含调试符号。

var bytecode = ShaderBytecode.CompileFromFile("shader.fx", "VShader", "vs_4_0", ShaderFlags.Debug, EffectFlags.None)

希望它在本机 Direct3D 中是类似的。

于 2012-07-30T10:36:38.570 回答
1

我能够在 VS2012 中调试着色器。

我使用了这个命令行:

fxc /TTargetProfile /EShaderMainFunctionName /Od /Zi /FdMyShader.pdb MyShaderFile

在代码中,我使用了:

D3DX11CompileFromFile(filename, NULL, NULL, "ShaderMainFunctionName, "TargetProfile", D3D10_SHADER_DEBUG | D3D10_SHADER_SKIP_OPTIMIZATION, ...);

TargetProfile 类似于vs_5_0or ps_5_0

我很确定它可以与 D3DCompile 一起使用。

当我忘记放置D3D10_SHADER_DEBUG | D3D10_SHADER_SKIP_OPTIMIZATION时,我尝试手动加载 pdb 文件,它说符号不匹配。

当我做对时,Pixel History 视图中的 Pixel Shader 是一个蓝色链接。当我点击它时,它会自动加载正确的文件,我可以开始调试它。

我找不到生成 pdb 文件的 /Fd 的代码内等效项,这就是我必须通过命令行的原因。

于 2014-02-07T02:06:57.393 回答