顶点着色器与片段着色器:
区别:
1、顶点着色器以定位为单位进行计算;片段着色器以像素为单位进行计算;计算复杂度不一样,片段计算次数远大于顶点;
2、顶点着色器一般用于定义每个顶点的如位置信息、颜色信息等,然后传输到片段着色器中;片段着色器一般只输出颜色信息;
材质属性:
材质的属性一般在shader的Properties{}中构建,其中包含且不仅包含Color、int、float、Vector、2D纹理等。
常用的Color可以添加[HDR]让颜色实现高光动态渲染,int可以添加[Toggle]可以让该值实现勾选功能,float可以添加[intRange]绘制一个int输入的滑杆,2D纹理可以添加[NoScaleOffset]可以实现图片不能偏移和缩放(还有其他很多如Enum、搭配变体等功能,后面会做个专题)。
变体:
变体类似于C#开发中的宏,通过特定的开关来执行指定的渲染方式
变体的优点在于将多个类似的功能集成到一个shader里面,便于使用和管理
缺点在于加载时间过长,并导致内存增加。
变体的定义:
可以在此处看到变体的数量:
首先在properties中定义变体开关,然后定义变体,通过#if 与#endif 来制作类似于变体的宏从而实现变体功能,需要注意的是,该方法需要名字对应且都需要大写。
整体代码如下:
Shader "chen/Multi_Compile"
{
Properties
{
[Toggle]_MULTICOMPILETEST("变体测试",int) = 0
}
SubShader
{
pass
{
CGPROGRAM
#pragma multi_compile _ _MULTICOMPILETEST_ON
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 pos:POSITION;
float4 uv:TEXCOORD;
};
struct v2f
{
float4 pos:SV_POSITION;
float4 uv:TEXCOORD;
};
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.pos);
o.uv.xy = v.uv.xy;
return o;
}
fixed4 frag(v2f i):SV_TARGET
{
fixed4 c=1;
#if _MULTICOMPILETEST_ON
c=0.5;
#endif
return c;
}
ENDCG
}
}
}
回到Unity中,可以看到变体已经生效了: