shader语义:语义实际就是一个赋予shader输入输出的字符串;语义可以让shader知道从哪里读取数据,并把数据输出到哪里。但是并不一定需要特殊的意义。
系统数值语义:SV代表的含义就是系统数值。在渲染流水线中具有特殊的寓意。SV_POSITION(大多数平台与POSITION等义,索尼除外)语义修饰顶点着色器的输出变量pos。
锯齿参数调整。
经量使用较低精度,可以优化shader性能。
Shader Model等级决定了shader中各个特性的能力,体现在shader能够使用的运算符指令数目、寄存器个数等各个方面。
避免使用分支和循环语句,大大降低性能,将一些计算向cpu中进行预运算。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/2"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用cginc文件
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;//描述着色器输出的顶点位置
fixed4 color : COLOR0;
};
//appdata_full 内置结构体
v2f vert(appdata_full v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//可视化法线方向
o.color = fixed4(v.normal * 0.5 + fixed3(0.5, 0.5, 0.5), 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);
//可视化第一组纹理坐标的小数部分
//frac 取小数部分
o.color = frac(v.texcoord);
// 当你想将颜色值规范到0~1之间时,你可能会想到使用saturate函数(saturate(x)的作用是如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1
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;
}
//SV_Target 描述片元着色器的输出颜色
fixed4 frag(v2f i) : SV_Target {
return i.color;
}
ENDCG
}
}
}