前言:对shader基础知识不熟的,可以观看我的unity shader基础篇系列文章。同时本篇文章也不会对shader在unity中的基础使用做详细讲解。
设计思路:如下所示:
1.为了具有周期扭曲效果,我们可以使用周期函数sin,cos这些来对模型进行y轴旋转。
2.使用顶点距离模型中心点的距离来作为角度值,并结合时间来控制。
3.y轴旋转矩阵和MVP矩阵进行乘值时,性能不如单独对x和z轴分量进行y轴旋转处理。因为矩阵相乘是每个分量都相乘,而且有些为0相乘是没必要的,y轴和w轴的相乘也是不变的。
核心代码:如下所示:
Shader "Custom/demo8" {
SubShader {
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f {
float4 pos:POSITION;
fixed4 col:COLOR;
};
// 扭曲效果
v2f vert(appdata_base i)
{
// 获取顶点距离模型中心点的距离来作为角度值
float angle = length(i.vertex) * _SinTime.w;
// 由于旋转模型顶点时,只需要对x和z轴进行旋转处理,而且旋转矩阵中为0的也没必要进行计算, 所以此处可以将旋转矩阵抽离出来进行单独的顶点x和z轴分量进行处理
float x = cos(angle) * i.vertex.x + sin(angle) * i.vertex.z;
//float y = 1 * i.vertex.y; // 等于不变y轴,可以不参与计算
float z = -sin(angle) * i.vertex.x + cos(angle) * i.vertex.z;
// float w = 1 * i.vertex.w; 等于不变w,可以不参与计算
// 修改模型坐标
i.vertex.x = x;
i.vertex.z = z;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, i.vertex);
o.col = fixed4(0, 1, 1, 1);
return o;
}
void frag(v2f i, out fixed4 col:COLOR)
{
col = i.col;
}
ENDCG
}
}
}
运行效果:如图所示: