语义
TEXCOORD0 ----模型第一组纹理坐标
系统数组语义:
SV_POSITION POSITION
SV_Target COLOR
Unity支持的语义
POSITION
NORMAL
TANGENT
TEXCOORDn:该顶点的纹理坐标
COLOR:顶点颜色
其中,TEXCOORD的n的数目和Shader Model有关,Shader Model2 和 Shader Model3 n=8,4和5中,n=16
顶点着色器传递给片元着色器Unity常用语义:
SV_POSITION:裁剪空间中的顶点坐标,结构体中必须包含
COLOR0:输出第一组顶点颜色
TEXCOORD:输出纹理坐标
片元着色器输出Unity支持的常用语义:
SV_Target
调试方法
1.假彩色图像2.windows vs Graphics Debugger
内置结构体(在UnityCG.cginc里,偷懒用)
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f_vertex_lit { float2 uv : TEXCOORD0; fixed4 diff : COLOR0; fixed4 spec : COLOR1; };
自定义Shader,支持实例化渲染
#pragma multi_compile_instancing
启用实例化渲染(材质球上将出现启用实例化的勾选框);
UNITY_VERTEX_INPUT_INSTANCE_ID
在a2v及v2f的结构中定义实例化索引下标(SV_InstanceID ),也就是当前渲染单位的索引,用于从Constant Buffer中提取正确的属性(做显示差异化用);
UNITY_INSTANCING_BUFFER_START ~ END
在这个起止区域内定义属性,才能在着色器中正确的根据索引提取出当前渲染单位所对应的属性;
UNITY_SETUP_INSTANCE_ID
定义在着色器的起始位置,使顶点着色器(或片段着色器)可以正确的访问到实例化单位的索引;
UNITY_ACCESS_INSTANCED_PROP
根据索引访问到这个单位对应的属性,如上面例子中每个箱子的颜色属性。
DirextX平台
平台判断
UNITY_UV_STARTS_AT_TOP 判断当前平台是否是DirextX平台
抗锯齿判断
_MainTex_TexelSize.y < 0
不支持tex2D,需要#progma target 3.0 然后使用tex2Dlod
Shader语法规范
fixec 11位 half 16位 float 32位 尽量选择更小的精度
类型相匹配的参数对变量进行初始化。
慎用if while等分支语句
不要除以0