我不知道你们中是否有很多人尝试使用Visual Studio 2012的新功能来调试基于Direct3D的应用程序。
我成功捕获了我的应用程序的一个框架,然后我想调试顶点着色器的执行:
我单击绿色三角形来调试给定的顶点,但是我找到了“No Symbol Found”消息,这阻止我调试它。
有人知道如何为Visual Studio找到符号吗?
感谢。
答案 0 :(得分:4)
您需要使用调试信息编译着色器。并且为了可靠地调试,您可能还希望禁用优化。根据编译着色器的方式,这将是以下两种方式之一:
D3DCompile / D3DCompileFromFile:将D3DCOMPILE_DEBUG
和D3DCOMPILE_SKIP_OPTIMIZATION
标志传递给D3DCompile。请注意,根据D3D版本以及您是否使用D3DX,这些标志可能具有不同的前缀。
fxc.exe :编译标志具有等效的开关。对于D3DCOMPILE_DEBUG
,将/Zi
传递给fxc。对于D3DCOMPILE_SKIP_OPTIMIZATION
,请传递/Od
。
Visual Studio 2012非常聪明地根据嵌入的调试信息查找着色器的源代码,但是如果它无法执行此操作,它将提示您指向相应的文件。
答案 1 :(得分:3)
使用SlimDX时,您可以将ShaderFlags
传递给着色器编译器。传递ShaderFlags.Debug
会导致包含调试符号。
var bytecode = ShaderBytecode.CompileFromFile("shader.fx", "VShader", "vs_4_0", ShaderFlags.Debug, EffectFlags.None)
希望它在原生Direct3D中类似。
答案 2 :(得分:3)
答案 3 :(得分: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_0
或ps_5_0
。
我很确定它适用于D3DCompile。
当我忘记放D3D10_SHADER_DEBUG | D3D10_SHADER_SKIP_OPTIMIZATION
时,我试图手动加载pdb文件,它说符号不匹配。
当我做对了,Pixel History视图中的Pixel Shader是一个蓝色链接。当我点击它时,它会自动加载正确的文件,我可以开始调试它。
我找不到生成pdb文件的/ Fd的代码内等价项,这就是我必须通过命令行的原因。