实践篇:简单扭曲

前言:对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
		}
	}
}

运行效果:如图所示:
在这里插入图片描述

发布了81 篇原创文章 · 获赞 39 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/zjz520yy/article/details/88685617