这篇文章是根据某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);
可以看到一个斜着的水面效果.
小提示!
如果你尝试更改为
<pre name="code" class="plain">v.vertex.y += sin(length(v.vertex.xz)*2 + _Time.w);
会看到一个很恶心的从原心波动的效果! 根据这个自由扩展吧!
这是我的第一次在CSDN上写博客,之后我会尽量把学习的东西都搬上CSDN上,请大家多多关照。