Unity Shader 的三种调试方法
假彩色图像法
(与之对应的是真彩色图像(true-color image))
- 使用一张假彩色图像用于可视化数据。由于颜色的分量区间为[ 0 , 1],且当颜色分量小于0时,会被设置为0,颜色分量大于1时,会被设置为1。因此我们需要不断尝试,最后是得我们的颜色能够出现在 [ 0 , 1] 的区间内。
- 当调试一维数据时,可以选择单独的颜色分量进行输出,而把其他颜色的分量设置为0。
- 当调试多维数据时,可以选择对它的一个或多个分量进行单独调试。
假颜色图像法的实例代码:
Shader"DebuggerShader/Debugger_FalseColor"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR0;
};
v2f vert(appdata_full v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//可视化法线
o.color = fixed4(v.normal * 0.5 + fixed3(1, 1, 1), 1.0);
//可视化切线
o.color = fixed4(v.tangent.xyz * 0.5 + fixed3(0.5, 0.5, 0.5), 1.0);
//可视化副切线
fixed3 binormal = cross(v.normal, v.tangent.xyz) * v.tangent.w;
o.color = fixed4(binormal * 0.5 + fixed3(0.5, 0.5, 0.5), 1.0);
//可视化第一组纹理坐标
o.color = fixed4(v.texcoord.xy, 0.0, 1.0);
//可视化第二组纹理坐标
o.color = fixed4(v.texcoord1.xy, 0.0, 1.0);
//可视化第一组纹理坐标的小数部分
o.color = frac(v.texcoord);
if (any(saturate(v.texcoord) - v.texcoord))
o.color.b = 0.5;
o.color.a = 1.0;
//可视化第二组纹理坐标的小数部分
o.color = frac(v.texcoord1);
if (any(saturate(v.texcoord1) - v.texcoord1))
o.color.b = 0.5;
o.color.a = 1.0;
//可视化顶点颜色
//o.color = v.color;
return o;
}
fixed4 frag(v2f i) : SV_Target{
return i.color;
}
ENDCG
}
}
}
Graphics Debugger
1、编译C#,并配合VS对Unity的shader进行调试,需要先在VS Installer之中安装关于DirectX的独立组件:
2、使用VS新建一个C++的空项目
3、点击该项目中的属性→配置属性→调试
在该图中的④中,有两个需要更改的值。
一个是 需要调试的Unity版本,是当前的版本Unity,而不是要调试的某个项目。
二个是 将-force-d3d11
填入到 命令参数 中
4、在VS中点击调试→图形→启动图形调试
要注意: 这里新建的是一个C++ 的空项目,而这个项目仅仅只是用来当作DirectX Graphics Debugger的启动窗口兼调试窗口
5、选择需要调试的项目
当得到了这个窗口后,选择Open project
6、查看打开的Unity窗口中是否存在如下字样:
如果有,那么就已经成功接入该项目。
7、重新编辑本文开头中假彩色图像法的代码进一步测试,添加#pragma enable_d3d11_debug_symbols
如图
8、点击键盘上的PrtSc
键进行屏幕捕获(笔记本可能需要按住Fn + PrtSc
组合键)
最终捕获到上图 的左下角的图 双击进入
9、左键选择图像进行调试
点击调试 当前顶点
10、此步骤可能存在 反汇编 的问题
然后再重新调试
11、Debug Begin!
帧调试器
打开之后便可以开始调试
此处也可以调整Unity的渲染次序。
参考:https://docs.unity3d.com/2019.1/Documentation/Manual/SL-DebuggingD3D11ShadersWithVS.html
参考书籍:《Unity Shader入门精要》人民邮电出版社 冯乐乐著