Shader学习笔记_Vertex Shader_几何变换_波


这篇文章是根据某Unity教学网站的shader教程来写的笔记。

由于本人技术水平方面的欠缺可能会有各种各样严重的错误,没有任何参考价值,欢迎各位大佬指正。

本次由于是根据之前的课程中途开始写的笔记,所以是在先贴出基本的顶点和片段代码块,和操作步骤。

先在Unity中创建Material,shader各一个, 随你命名什么  之后在场景中创建一个plane

在shader中添加如下代码

Shader "Custom/Wave" {
	SubShader {
	pass{
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		
		struct v2f
		{
			float4 pos:POSITION;	
			float4 col:Color;
		};
		
		v2f vert(appdata_base v)
		{			
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);  
		    <span style="white-space:pre">	</span>o.col= fixed4(0,1,1,1);
			return o;			
		}
		fixed4 frag(v2f IN):COLOR
		{
			return IN.col;
		}
		
		ENDCG
	    } 
	}
}
还是简要说一下,Unity一共有三种形态, 固定管线 Shader,  vertex和fragment shader和SubFace shader

对于固定管线Shader,据说已经在unity5.1中已经完全移除,目前所针对的是顶点和片段shader

一般来说顶点函数用于处理顶点位置,大小,片段函数用于处理像素



目标:顶点和片段shader水波变换

首先在vert函数中加入

		v.vertex.y += sin(_Time.y + _Time.y);
绑上物体后可以看到物体顶点开始上下的移动...这是因为上述代码是对所有顶点进行上下运动。

_Time是Cg语言中的内置函数 下表可以看到是float4类型 x,y,z,w分别对应如下,下面的t是时间

之后再更改如下

	<span style="white-space:pre">	</span>v.vertex.y += sin(v.vertex.x + _Time.y);

可以看到plane会沿着 x方向波动,有了似乎是旗帜的效果。

这时可以试着自由更改v.vertex.x为v.vertex.z可以发现会沿z来运动,这时把参数进行乘除法会相应减少波动振幅

咳咳,这似乎好像是一个高中数学叫正弦波的概念……我不太了解。

额,看来得看看数学了

然后再试着更改颜色

	 o.col= fixed4(v.vertex.y,v.vertex.y,v.vertex.y,1);

由于之前是根据顶点来变换的,所以颜色参数更改为顶点会随着波动上下来变色,会出现一点所谓伪光线的效果


但是这个效果仍然不是很好…

据老师说在04年那本CG语言里提出了用4个正弦波才能模仿出比较好的湖面效果


由于机能限制,我们可以先用两个正选波,可以把相应行改为

			v.vertex.y += 0.2 * sin((v.vertex.x + v.vertex.z) + _Time.y);		
			v.vertex.y += 0.3 * sin((v.vertex.x - v.vertex.z) + _Time.w);		

可以看到一个斜着的水面效果.



之后如果我研究那本10年前的书,我会试着写一个四个正弦波的效果。


小提示!

如果你尝试更改为

<pre name="code" class="plain">v.vertex.y +=  sin(length(v.vertex.xz)*2 + _Time.w);


 会看到一个很恶心的从原心波动的效果! 根据这个自由扩展吧! 
 



这是我的第一次在CSDN上写博客,之后我会尽量把学习的东西都搬上CSDN上,请大家多多关照。


猜你喜欢

转载自blog.csdn.net/qq_26988595/article/details/49763811