写在前面
Shader主要是用来模拟3D对象光照的真实情况,但不仅仅如此,他不仅仅定义了Objects看起来怎么样,还可以完全的重定义Objects的形状。
在这一章节,将学到:
+ 在Surface Shader访问顶点颜色
+ 在Surface Shader实现顶点动画
+ 挤压使模型变形
+ 实现雪
+ 实现体积爆炸效果
简介
在第一章节,创建了第一个shader,解释了3D模型不仅仅是三角面片的集合体。每个顶点还会包含一些额外的数据,为了更好的渲染他自己。这里将探索怎么去访问这下数据,并且在我们shader中使用。
通过Surface Shader访问顶点颜色
首先需要知道的是,一个顶点函数可以返回关于顶点自身的信息,并且是我们可以控制的。我们可以接收到顶点的法向量(一个float3值),顶点的位置(float3),你还可以往里面存储颜色(float4)。这里将展示如何去保存顶点颜色,以及如果利用顶点颜色。
我们需要定义vert函数的返回结构
struct Input
{
float2 uv_MainTex;
float2 vertColor;
}从输入中获取顶点颜色,并返回
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
};
上面是Unity内置定义的完整顶点结构,我们将从color字段获取倒顶点颜色,所以顶点函数大概长这个样子
void vert(inout appdata_full v, out Input o)
{
o.verColor = v.color;
}
- 在Surface中使用
最后在surf中对颜色进行最终的处理已达到我们想要的效果
void surf(Input IN, inout SurfaceOutput o)
{
o.Albedo = IN.vertColor.rgb * _MainTint.rgb; //简单的和主颜色叠加
}
更多
我们还可以使用vert color的第四个字段,因为我们定义的结构是一个float4类型的值。这意味着我们可以传递顶点的Alpha。你可以利用这个字段去优化对象的显示,实际上第四个字段的意义可以完全由开发者自己去控制,例如Alpha,添加透明,提供一个掩码去做纹理混合。
在Unity5中,可以使用DirectX11去编译我们的shader,但有一点瑕疵是Unity将不会给你任何提醒,即使是你的shader不能通过编译。仅仅需要在vert中添加一行代码:
void vert(inout appdata_full v, out Input o)
{
UNITY_INITALIZE_OUTPUT(Input, o);
o.vertColor = v.color;
}