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

来源:互联网 发布:php 使用aes加密 编辑:程序博客网 时间:2024/06/04 22:43


这篇文章是根据某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上,请大家多多关照。


0 0
原创粉丝点击