【系统学习Shader与后处理】第2篇:uv控制之water

我们每要实现一个效果,就如这个系列开头所说,先分析效果需要用什么模式来实现。

我们发现,水流动的效果跟uv有关,所以我们需要去控制uv。

控制uv一般有三种方式:

1.time

2.采样其他图

3.C#输入参数

然后根据这些参数,用某个公式实现

这个shader,使用了time + 采样其他图 +C#输入参数

使用time,是为了达成两个目的,

第一个目的是time参数平滑递增

第二个目的是uv本身的特点,是随着超出uv的范围后,又会回到uv起始位置

所以使用了time,我们就可以让水流动起来了。

我们采样了另一张图:

一般这张图叫做扰乱图,顾名思义,是为了让uv采样不规律。(实际上,也是有规律的,根据这个扰动图的rgb通道来的规律)

这就是我们对水需要的第二个效果,不太规律的流动。

为什么要使用扰动图,大家可以把扰动图当作编程时候的配置表,读取这张预先做好的配置表,这样我们的shader效率更高,不用即时运算。

上源码。

Shader "effect/water" {
Properties {
_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)  //颜色值,我们暴露出来,可以控制水根据天气的变化,比如夕阳的时候,水变红
_NoiseTex ("Distort Texture (RG)", 2D) = "white" {}  //扰乱图
_MainTex ("Alpha (A)", 2D) = "white" {}
_HeatTime ("Heat Time", range (-0.2,1)) = 0
_ForceX ("Strength X", range (0,1)) = 0.1
_ForceY ("Strength Y", range (0,1)) = 0.1
}

Category {
Tags { "Queue"="Transparent+99" "RenderType"="Transparent" }
Blend SrcAlpha One
Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}

SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_particles
#include "UnityCG.cginc"

struct appdata_t {
float4 vertex : POSITION;
float2 texcoord: TEXCOORD0;
};

struct v2f {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 uvmain : TEXCOORD1;
};

fixed4 _TintColor;
fixed _ForceX;
fixed _ForceY;
fixed _HeatTime;
float4 _MainTex_ST;
float4 _NoiseTex_ST;
sampler2D _NoiseTex;
sampler2D _MainTex;

v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uvmain = TRANSFORM_TEX( v.texcoord, _MainTex );
return o;
}

fixed4 frag( v2f i ) : COLOR
{
//noise effect
fixed offsetColor1 = tex2D(_NoiseTex, i.uvmain + _Time.yx*_HeatTime).r;
fixed offsetColor2 = tex2D(_NoiseTex, i.uvmain + _Time.xy*_HeatTime).g;
fixed off = offsetColor1+offsetColor2-1;

//fixed off = lerp(offsetColor1,offsetColor2,0.5f);

i.uvmain.x += off * _ForceX;
i.uvmain.y += off * _ForceY;
return 2.0f * _TintColor * tex2D( _MainTex, i.uvmain);

}
ENDCG
}
}
// ------------------------------------------------------------------
// Fallback for older cards and Unity non-Pro

SubShader {
Blend DstColor Zero
Pass {
Name "BASE"
SetTexture [_MainTex] { combine texture }
}
}
}
}

原文地址:https://www.cnblogs.com/sundayofit/p/8364664.html

时间: 2024-08-24 07:19:15

【系统学习Shader与后处理】第2篇:uv控制之water的相关文章

Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画

控制人物动画播放 这里我重新弄了一个简单的场景和新的Animator Controller来作为示例. 下面先看看Animator Controller的配置: 人物在站立状态只能进入走路,走路只能进入奔跑或返回站立,奔跑只能进入跳跃或返回走路,跳跃则只能返回奔跑. 参数方面为两个参数: Float类型的moveSpeed: Trigger类型的Jump: 连线直接的转换条件为:moveSpeed大于0.1进入走路,走路moveSpeed大于0.9进入奔跑小于0.1返回站立,奔跑moveSpee

Linux系统学习之路和常用命令及其他系统相关内容

Linux系统学习之路 目录 Linux系统学习之路[第一篇]:Linux目录和基础知识 Linux系统学习之路[第二篇]:文件操作,文件查看,find查找 Linux系统学习之路[第三篇]:grep,vim,压缩功能详解 Linux系统学习之路[第四篇]:mount,rpm,yum,yum组讲解 Linux系统学习之路[第五篇]:用户和用户组管理 Linux系统学习之路[第六篇]:权限管理 Linux系统学习之路[第七篇]:磁盘和文件管理 Linux系统学习之路[第八篇]:LVM逻辑卷和RAI

前段时间一直不知道怎么学习,在网上找到一篇好文章分享给在路上的产品经理

如果你也是一枚刚入门的交互设计师,是不是常有这样一种感觉:不知从何下手,闷头读了一大堆书.学了一大堆软件.画了一大堆图之后还是感觉心里不踏实,总害怕自己还缺点什么,恨不得要有本<交互设计学习大纲>就好了.出现这个问题有两个原因,一是交互设计师没有可视性强的产物,交互设计师的产物一般是线框图.流程图.信息架构图.说明文档等等,但这些东西既不如视觉设计稿华丽精美,也不如程序代码高贵冷艳,在外行人看来初级交互设计师和高级交互设计师画的好像都差不多,轻易看不出你修炼到了几层功力;第二个原因是交互设计是

Spring MVC学习笔记(一)--------准备篇

这一系列笔记将带你一步一步的进入Spring MVC,高手勿喷. 首先你得安装以下的工具: JDK,虽然JDK8已经发布了一段时间了,但是由于我们并不会使用到里面的新特性,所以JDK6以上版本皆可以(需加入到PATH环境变量中): Servlet Container,为了能运行WEB应用程序,因此需要一个Web Container,这里我们建议Tomcat即可: IDE,一个好的IDE不仅能提高你开发的效率,还能降低你学习的成本,我们选择的是IntelliJ: 构建工具,推荐使用Gradle,它

【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文介绍了Unity中Shader书写中会用到的剔除.深度测试.Alpha测试以及基

数百个 HTML5 例子学习 HT 图形组件 – 3D 建模篇

http://www.hightopo.com/demo/pipeline/index.html <数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇>里提到 HT 很多情况下不需要借助 3Ds Max 和 Blender 等专业 3D 建模工具也能做出很多效果,例如  http://www.hightopo.com/guide/guide/core/3d/examples/example_3droom.html 这个 3D 电信机房监控例子整个都是通过 HT 提供的 AP

数百个 HTML5 例子学习 HT 图形组件 – 3D建模篇

http://www.hightopo.com/demo/pipeline/index.html <数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇>里提到 HT 很多情况下不需要借助 3Ds Max 和 Blender 等专业 3D 建模工具也能做出很多效果,例如  http://www.hightopo.com/guide/guide/core/3d/examples/example_3droom.html 这个 3D 电信机房监控例子整个都是通过 HT 提供的 AP

原创:聊Python小白如何系统自学成为Python大牛(基础篇一)上

支持原创 本文章,由头条py柯西发表,禁止转载,希望大家支持原创 欢迎大家点击复制链接看原文https://www.toutiao.com/i6545819194888290820/ 本原创除这一章外,后续还会衍生出后续进阶的学习方法总章 一.学习前言 二.环境搭建 三.Python的基本概念一.学习前言 很多人在自学Python的时候,总是不知道如何学习,不知道该怎么学,今天看到框架,就想学flask或者其他框架,但是当学的时候又茫然了,不知道怎么学:想学Python,但是又不知道Python

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是