工欲善其事必先利其器,作为一个逻辑开发者,刚开始学习unity shader的时候,最头痛的我就觉得就是shader的调试吧,总是想单步调试下看看具体的数值是怎么变化的,尤其是显示效果不对的时候。虽然现在我认为当你习惯用假色彩图像调试之后,确实单步debug没有太大的必要,但是今天还是总结一下吧,我觉得利用工具是非常有利于理解渲染流程的。
先说下最常用的工具就是visual studio了,unity 官方的教程在这里,这里我就不多说了,
Debugging DirectX 11/12 shaders with Visual Studiodocs.unity3d.com![aea556f2461b51593cbdb5c852d84c09.png](https://img-blog.csdnimg.cn/img_convert/aea556f2461b51593cbdb5c852d84c09.png)
这里只说他的缺点,就是每次都要用vs 启动unity 编辑器,比较繁琐和耗时,而且装的东西也比较多。那么接下来就说说我们的主角RenderDoc (
RenderDoc - RenderDoc documentationrenderdoc.org![9d1ae70a5ecfc7e58cb0de35559abf3b.png](https://img-blog.csdnimg.cn/img_convert/9d1ae70a5ecfc7e58cb0de35559abf3b.png)
) ,当我第一次发现这个工具的时候,非常兴奋,觉得终于有一个符合我的编程习惯的工具了。接下来就简单介绍一下吧。RenderDoc是一个开源的可以调试shader的工具,我主要讲一下和unityshader 结合使用的部分。
- 首先在官网下载他的release版本,我现在用的是V1.4, 下载地址是
![3769a5216fe7bf619cc29a9c06e69186.png](https://img-blog.csdnimg.cn/img_convert/3769a5216fe7bf619cc29a9c06e69186.png)
也可以去github 下载他的源码编译最新的版本,github地址是 (
baldurk/renderdocgithub.com![d42edce18c6469c6eaaf7c7b96844b18.png](https://img-blog.csdnimg.cn/img_convert/d42edce18c6469c6eaaf7c7b96844b18.png)
)
2.下载安装RenderDoc后,打开unity ,可以在Scene或者Game视图右键,弹出LoadRenderDoc菜单,然后点击加载就可以了
![d563ee7fb344c33bec58fc8c70ed50b1.png](https://img-blog.csdnimg.cn/img_convert/d563ee7fb344c33bec58fc8c70ed50b1.png)
3.加载之后,会在视图上出现一个renderdoc的Logo,如下图
![6a8ecbc1641aa284e374cc8c46f5273e.png](https://img-blog.csdnimg.cn/img_convert/6a8ecbc1641aa284e374cc8c46f5273e.png)
4.点击这个图标,会调用起RenderDoc 并且自动截图
![90e08196dfae6f5c3faee649b3287b04.png](https://img-blog.csdnimg.cn/img_convert/90e08196dfae6f5c3faee649b3287b04.png)
5.我们双击我们截图的的图片,这时候会出现我们的事件列表
![185a264b2f707e999e2b92d1f9062b18.png](https://img-blog.csdnimg.cn/img_convert/185a264b2f707e999e2b92d1f9062b18.png)
6.如果你的窗口现在没有打开TextureViewer MeshViewer PipeLineState的话,你可以通过window 菜单项打开他们,方便我们先运行效果。至于这些窗口的说明和介绍,大家可以去看官方文档。
7.接下来就是调试我们的shader了 ,这时候要注意的一个点就是我们要在我们的shader里面加上一句宏
#pragma enable_d3d11_debug_symbols
,来保证unity 不会优化掉我们的调试信息,把他放到我们的CGPROGRAM 代码块里面,记得renderdoc截图的时候,保证这句代码已经在shader里面的,之前没有加的话,记得重新走一次renderdoc截图啊,还有截图的时候最好保证unity的其他窗口是关闭的,保证只有game视图一个窗口,不然截图的内容可能是错误的
![38d30e94c57b919706524af4f54aed1b.png](https://img-blog.csdnimg.cn/img_convert/38d30e94c57b919706524af4f54aed1b.png)
8.OK,当我们看到事件列表的时候,我们选择我们要调试的一个事件,
![b904423a2da7ce8cd091f64655b50bd5.png](https://img-blog.csdnimg.cn/img_convert/b904423a2da7ce8cd091f64655b50bd5.png)
大家一定注意选择的事件,不要选择错了,不然选择的是其他事件,调用的不是你想要调试的shader,那么你看到调试代码就是dxbc格式的,不是我们想要的HLSL的格式,我们选中事件之后,在mesh Viewer面板可以调试vertex shader,在texture viewer可以调试frag shader .
在mesh viewer 面板就是 选中一个点,然后右键,选择debug this vertex
![48711ec8b524a3c734f793b2ba41bb03.png](https://img-blog.csdnimg.cn/img_convert/48711ec8b524a3c734f793b2ba41bb03.png)
就会打开调试面板 ,
![572d248d5a48d9d557834a51759c62e6.png](https://img-blog.csdnimg.cn/img_convert/572d248d5a48d9d557834a51759c62e6.png)
然后我们选择Debug in HlSl 就可以切换到Hlsl语法代码,进行愉快的调试了
![c553319fa02fb0200d6b5edbfa099537.png](https://img-blog.csdnimg.cn/img_convert/c553319fa02fb0200d6b5edbfa099537.png)
点击debug in assembly 可以来回切换面板
9.如何调试frag shader呢,跟上面差不多,打开textureview 面板
![c2289d56989004f3697def78dfaaaf58.png](https://img-blog.csdnimg.cn/img_convert/c2289d56989004f3697def78dfaaaf58.png)
右键选中你要调试的片元,然后点击右下角的debug按钮即可。
![664ca43718cec4526d168a8ccea476dd.png](https://img-blog.csdnimg.cn/img_convert/664ca43718cec4526d168a8ccea476dd.png)
下面的watch 面板就是监视面板,你可以监察你的变量。也可以打断点一步一步调试,用法和vs差不多。
10.你也可以在pipleline state面板来看各个流程,可以实时编辑你的shader,来调整效果,
![b96c5f30a8fc51a735568b70e49e2ee3.png](https://img-blog.csdnimg.cn/img_convert/b96c5f30a8fc51a735568b70e49e2ee3.png)
点击edit
![14cd98d7aac4dd0fe0bac3189a97f9ab.png](https://img-blog.csdnimg.cn/img_convert/14cd98d7aac4dd0fe0bac3189a97f9ab.png)
修改代码后,点击F5键刷新就可以在textureviewer看效果,
![2c9b6425d9dbc4727364c88a2a63dca8.png](https://img-blog.csdnimg.cn/img_convert/2c9b6425d9dbc4727364c88a2a63dca8.png)
好了,简单的介绍就到这里,总而言之,用renderdoc还是很方便的,解决了心头大患,具体更详细的介绍和使用,大家可以去官网在去了解下。
如果你觉得这篇文章对你有帮助,就帮忙点个赞吧!