vs调试按钮为灰色的_Unity Shader 调试

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

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

Debugging DirectX 11/12 shaders with Visual Studio​docs.unity3d.com
aea556f2461b51593cbdb5c852d84c09.png

这里只说他的缺点,就是每次都要用vs 启动unity 编辑器,比较繁琐和耗时,而且装的东西也比较多。那么接下来就说说我们的主角RenderDoc (

RenderDoc - RenderDoc documentation​renderdoc.org
9d1ae70a5ecfc7e58cb0de35559abf3b.png

) ,当我第一次发现这个工具的时候,非常兴奋,觉得终于有一个符合我的编程习惯的工具了。接下来就简单介绍一下吧。RenderDoc是一个开源的可以调试shader的工具,我主要讲一下和unityshader 结合使用的部分。

  1. 首先在官网下载他的release版本,我现在用的是V1.4, 下载地址是
RenderDoc​renderdoc.org
3769a5216fe7bf619cc29a9c06e69186.png

也可以去github 下载他的源码编译最新的版本,github地址是 (

baldurk/renderdoc​github.com
d42edce18c6469c6eaaf7c7b96844b18.png

2.下载安装RenderDoc后,打开unity ,可以在Scene或者Game视图右键,弹出LoadRenderDoc菜单,然后点击加载就可以了

d563ee7fb344c33bec58fc8c70ed50b1.png

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

6a8ecbc1641aa284e374cc8c46f5273e.png

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

90e08196dfae6f5c3faee649b3287b04.png

5.我们双击我们截图的的图片,这时候会出现我们的事件列表

185a264b2f707e999e2b92d1f9062b18.png

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

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

 #pragma enable_d3d11_debug_symbols

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

38d30e94c57b919706524af4f54aed1b.png

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

b904423a2da7ce8cd091f64655b50bd5.png

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

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

48711ec8b524a3c734f793b2ba41bb03.png

就会打开调试面板 ,

572d248d5a48d9d557834a51759c62e6.png

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

c553319fa02fb0200d6b5edbfa099537.png

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

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

c2289d56989004f3697def78dfaaaf58.png

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

664ca43718cec4526d168a8ccea476dd.png

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

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

b96c5f30a8fc51a735568b70e49e2ee3.png

点击edit

14cd98d7aac4dd0fe0bac3189a97f9ab.png

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

2c9b6425d9dbc4727364c88a2a63dca8.png

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

如果你觉得这篇文章对你有帮助,就帮忙点个赞吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现角色消失、溶解或隐身的效果可以使用Unity Shader编写。一种常用的方法是使用渐变进行角色的消失或出现。 以下是一个简单的Unity Shader代码示例,用于实现角色消失的效果: ``` Shader "Custom/Disappear" { Properties { _MainTex ("Texture", 2D) = "white" {} _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 _FadeRange ("Fade range", Range(0,1)) = 0.1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque"} LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float _Cutoff; float _FadeRange; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); float alpha = col.a; float dist = abs(i.uv.y - 0.5); alpha = smoothstep(_Cutoff - _FadeRange, _Cutoff + _FadeRange, alpha); alpha *= smoothstep(0, _FadeRange, dist); col.a = alpha; return col; } ENDCG } } } ``` 在这个Shader中,我们使用_MainTex来获取角色的纹理。_Cutoff和_FadeRange分别控制渐变的起点和终点。在fragment shader中,我们使用smoothstep函数来实现渐变效果,并使用dist变量来控制渐变的位置,使角色从中心开始渐变消失。 你可以将这个Shader应用到角色的材质中,然后使用代码控制_Cutoff和_FadeRange参数来实现角色的消失效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值