1.根据到中心的距离来扭曲
shader代码
Shader "Custom/twistPlane"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
//模型坐标
float angle = length(v.vertex);
float4x4 mat = float4x4(
cos(angle),0,sin(angle),0,
0,1,0,0,
-sin(angle),0,cos(angle),0,
0,0,0,1
);
float4x4 mvp = float4x4(UNITY_MATRIX_MVP);
//注意这个地方的相乘顺序
//多个变换的时候,要左乘。因为最后返回的是一个矩阵,所以向量要放最后
//即 m1*m2*vec,这样才能保证乘出来的结果是一个4x1的向量
mat = mul(mvp,mat);
v2f o;
o.vertex = mul(mat,v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(1,1,0,1);
}
ENDCG
}
}
}
效果:
2.加上时间变化
Shader "Custom/twistPlane"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
//模型坐标
float angle = length(v.vertex) * _SinTime.w;
float4x4 mat = float4x4(
cos(angle),0,sin(angle),0,
0,1,0,0,
-sin(angle),0,cos(angle),0,
0,0,0,1
);
float4x4 mvp = float4x4(UNITY_MATRIX_MVP);
//注意这个地方的相乘顺序
//多个变换的时候,要左乘。因为最后返回的是一个矩阵,所以向量要放最后
//即 m1*m2*vec,这样才能保证乘出来的结果是一个4x1的向量
mat = mul(mvp,mat);
v2f o;
o.vertex = mul(mat,v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(1,1,0,1);
}
ENDCG
}
}
}
效果:
3.等效代码
也可以这样写
v.vertex = mul(mat,v.vertex);
float4x4 mvp = float4x4(UNITY_MATRIX_MVP);
v2f o;
o.vertex = mul(mvp,v.vertex);
4.x方向的上的缩放
v2f vert (appdata v)
{
//模型坐标
float angle = length(v.vertex) * _SinTime.w;
float4x4 mat = float4x4(
sin(angle)/8 +0.5,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
);
v.vertex = mul(mat,v.vertex);
float4x4 mvp = float4x4(UNITY_MATRIX_MVP);
//注意这个地方的相乘顺序
//多个变换的时候,要左乘。因为最后返回的是一个矩阵,所以向量要放最后
//即 m1*m2*vec,这样才能保证乘出来的结果是一个4x1的向量
v2f o;
o.vertex = mul(mvp,v.vertex);
o.uv = v.uv;
return o;
}
效果: