前言
当写的Shader出现了一些不是预期的效果时,可能需要对Shader进行调试。但Shader不像其它语言能加断点debug,也不能打印输出。输出的只能是颜色值,所以可以将想要看的变量变换成颜色值,可视化的来查看问题,当然这需要一些小小的转换。
顶点数据从哪里来
一般对Shader调试,主要是调试顶点数据及变换,那么顶点数据是如何设置到Shader中的呢?在Unity中,是由Mesh Renderer component对象每帧将mesh data发送到GPU中的(这个过程通常就叫做draw call)。每次draw call都会对性能有一定的开销,因此应当尽可能的在每次Draw call中传输大量Mesh.Mesh数据是由一组三角形(Triangle)列表数据组成,每个三角形有三个顶点(vertex),每个顶点存储着多个属性(attributes),如POSITION,NORMAL,TEXCOORD0,TEXCOORD1,TANGENT,COLOR等
内置顶点属性
通常将顶点属性组织到一个struct中。例如:
struct vertexInput{
flaot4 vertex:POSITION;
float4 tangent:TANGENT;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
float4 texcoord1:TEXCOORD1;
float4 texcoord2:TEXCOORD2;
float4 texcoord3:TEXCOORD3;
float4 color:COLOR;
}
这个结构在Shader中的用法如下:
Shader "Cg shader with all built-in vertex input parameters"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct vertexInput{
flaot4 vertex:POSITION;
float4 tangent:TANGENT;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
float4 texcoord1:TEXCOORD1;
float4 texcoord2:TEXCOORD2;
float4 texcoord3:TEXCOORD3;
float4 color:COLOR;