RenderDoc调试Shader(转)

原文地址:https://zhuanlan.zhihu.com/p/74622572

工欲善其事必先利其器,作为一个逻辑开发者,刚开始学习unity shader的时候,最头痛的我就觉得就是shader的调试吧,总是想单步调试下看看具体的数值是怎么变化的,尤其是显示效果不对的时候。虽然现在我认为当你习惯用假色彩图像调试之后,确实单步debug没有太大的必要,但是今天还是总结一下吧,我觉得利用工具是非常有利于理解渲染流程的。

先说下最常用的工具就是visual studio了,unity 官方的教程在这里,这里我就不多说了。

https://link.zhihu.com/?target=https%3A//docs.unity3d.com/Manual/SL-DebuggingD3D11ShadersWithVS.html

这里只说他的缺点,就是每次都要用vs 启动unity 编辑器,比较繁琐和耗时,而且装的东西也比较多。那么接下来就说说我们的主角RenderDoc (https://link.zhihu.com/?target=https%3A//renderdoc.org/docs/index.html) ,当我第一次发现这个工具的时候,非常兴奋,觉得终于有一个符合我的编程习惯的工具了。接下来就简单介绍一下吧。RenderDoc是一个开源的可以调试shader的工具,我主要讲一下和unityshader 结合使用的部分。

  1. 首先在官网下载他的release版本,我现在用的是V1.4, 下载地址是https://link.zhihu.com/?target=https%3A//renderdoc.org/
  2. 也可以去github 下载他的源码编译最新的版本,github地址是 (https://link.zhihu.com/?target=https%3A//github.com/baldurk/renderdoc/tree/v1.4
  3. 下载安装RenderDoc后,打开unity ,可以在Scene或者Game视图右键,弹出LoadRenderDoc菜单,然后点击加载就可以了

3.加载之后,会在视图上出现一个renderdoc的Logo,如下图

4.点击这个图标,会调用起RenderDoc 并且自动截图

6.如果你的窗口现在没有打开TextureViewer MeshViewer PipeLineState的话,你可以通过window 菜单项打开他们,方便我们先运行效果。至于这些窗口的说明和介绍,大家可以去看官方文档。

7.接下来就是调试我们的shader了 ,这时候要注意的一个点就是我们要在我们的shader里面加上一句宏

#pragma enable_d3d11_debug_symbols

来保证unity 不会优化掉我们的调试信息,把他放到我们的CGPROGRAM 代码块里面,记得renderdoc截图的时候,保证这句代码已经在shader里面的,之前没有加的话,记得重新走一次renderdoc截图啊,还有截图的时候最好保证unity的其他窗口是关闭的,保证只有game视图一个窗口,不然截图的内容可能是错误的


8.OK,当我们看到事件列表的时候,我们选择我们要调试的一个事件

大家一定注意选择的事件,不要选择错了,不然选择的是其他事件,调用的不是你想要调试的shader,那么你看到调试代码就是dxbc格式的,不是我们想要的HLSL的格式,我们选中事件之后,在mesh Viewer面板可以调试vertex shader,在texture viewer可以调试frag shader .

在mesh viewer 面板就是 选中一个点,然后右键,选择debug this vertex

就会打开调试面板

然后我们选择Debug in HlSl 就可以切换到Hlsl语法代码,进行愉快的调试了

点击debug in assembly 可以来回切换面板

9.如何调试frag shader呢,跟上面差不多,打开textureview 面板

右键选中你要调试的片元,然后点击右下角的debug按钮即可。

下面的watch 面板就是监视面板,你可以监察你的变量。也可以打断点一步一步调试,用法和vs差不多。

10.你也可以在pipleline state面板来看各个流程,可以实时编辑你的shader,来调整效果

点击edit

修改代码后,点击F5键刷新就可以在textureviewer看效果

好了,简单的介绍就到这里,总而言之,用renderdoc还是很方便的,解决了心头大患,具体更详细的介绍和使用,大家可以去官网在去了解下。