http://blog.youkuaiyun.com/qiul12345/article/details/6766217
很多学Directx特别初学者最头痛应该是shader的调试问题了。一般的编译器包括vs都不支持shader的调试。还好微软出了个Pix,其功能相当强大,而不仅仅是debug。这里我们入门主要总结下其debug的功能。
Pix的调试原理和一般的调试很不一样,它是先把程序运行一遍,然后把中间每一步所有的shader变量,寄存器等等都记录下来,然后再调出来看,以此模拟Directx的过程。
在用Pix调试shader代码前,要注意下几个问题。
1是必须在Directx11的编译hlsl函数加上下面的几行代码(注意加粗部分代码):
DWORD dwShaderFlags=D3DCOMPILE_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DCOMPILE_DEBUG;
dwShaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION;
#endif
hr=D3DX11CompileFromFile(L"basicEffect.hlsl",pDefines,NULL,szEntryPoint,szShaderModel,dwShaderFlags,NULL,NULL,ppBlobOut,&pErrorBlob,NULL);
如果是Directx10,则变成:
DWORD shaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )
shaderFlags |= D3D10_SHADER_DEBUG;
shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;
#endif
2是注意文件的路径问题,比如hlsl,纹理等。因为Pix默认这些文件是和Exe放在同一个文件夹里面。在读入这些文件时,如果是用系统的绝对路径,那么问题不大。否则就把这些文件放到和exe同一个文件夹下。
然后我们开始使用Pix了。打开Pix,打开file->New Experiment,选择要debug的program:
这里我们选了A single-frame模式,方便debug。
点击start experiment。
打开选中的程序后按下F12就可以捕获当前帧的所有数据。关掉选中的程序,PIX就会自动进入编辑调试模式
这里我们可以选择进入Render tab针对当前帧的某一像素进行debug;或者进入Mesh tab看顶点数据,包括顶点数据在进入vertex shader前后,进入geometry shader后的变化(这个必须在draw calls命令下才可以看)。
先试试选择进入Mesh tab:随便选中一个Draw()命令,点击Mesh,就可以看到以下各个顶点的数据,截图如下:
点击PostVS的VTX或者PostGS的Prim,就可以进入计算这个顶点或者Primitive的shader代码,这里我们选择了Prim下的P0,进入了调试P0的Geometry Shader状态:
然后我们就可以开始逐行的调试shader代码。
我们就大概做个入门总结到这里,其他大家可以慢慢摸索了。