用shader做水波纹效果

1.效果展示:

2.代码:
shader代码:

Shader "Unlit/Water"
{Properties{_MainTex("Texture", 2D) = "white" {}_WaterUV("WaterUV",2D) = "while"{}_WaterIntensity("WaterIntensity",float) = 500}SubShader{GrabPass{Name "BASE"Tags{ "Mode" = "Always" }}Tags{ "Queue" = "Transparent+100" "RenderType" = "Transparent" }Pass{CGPROGRAM
#pragma vertex vert
#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:Normal;};struct v2f{float2 uv : TEXCOORD0;float4 grabuv:TEXCOORD1;float4 vertex : SV_POSITION;float3 normal:Normal;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _GrabTexture;sampler2D _WaterUV;float4 _GrabTexture_TexelSize;float _WaterIntensity;v2f vert(appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);UNITY_TRANSFER_FOG(o,o.vertex);o.grabuv = ComputeGrabScreenPos(o.vertex);o.normal = v.normal;return o;}fixed4 frag(v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);float2 uv = tex2D(_WaterUV,i.uv).xy;uv = (uv - 0.5) * 2;float2 offset_ = uv * _GrabTexture_TexelSize.xy*_WaterIntensity;float4 grabuv = i.grabuv;grabuv.xy += sin(offset_);fixed4 grabCol = tex2Dproj(_GrabTexture,UNITY_PROJ_COORD(grabuv));return col*grabCol;}ENDCG}}
}

c#代码:

using UnityEngine;
using System.Collections;
using System.Threading;public class Water : MonoBehaviour
{public int m_texHeight = 512;public int m_texWidth = 512;public Texture2D m_waterTexture = null;private Material m_waterMatrial;private float[,] waveA;private float[,] waveB;public float decrement = 0.025f;public Camera m_waterCam;private int time;void Start(){m_waterTexture = new Texture2D(m_texWidth, m_texHeight, TextureFormat.RGBA32, false);m_waterMatrial = GetComponent<MeshRenderer>().material;Debug.Log("m_waterMatrial==" + m_waterMatrial);waveA = new float[m_texWidth, m_texHeight];waveB = new float[m_texWidth, m_texHeight];m_waterMatrial.SetTexture("_WaterUV", m_waterTexture);allColor = new Color[m_texWidth * m_texHeight];Thread t = new Thread(new ThreadStart(ThreadWave));t.Start();//  m_waterMatrial.SetTexture("_MainTex", m_waterTexture);}public void PopWater(Vector2 pos){float x = pos.x;float y = pos.y;waveA[(int)(m_texWidth * x), (int)(m_texHeight * y)] = 1;//waveA[(int)(m_texWidth * x) - 1, (int)(m_texHeight * y) ] = 1;//waveA[(int)(m_texWidth * x) + 1, (int)(m_texHeight * y) ] = 1;//waveA[(int)(m_texWidth * x) , (int)(m_texHeight * y) - 1] = 1;//waveA[(int)(m_texWidth * x), (int)(m_texHeight * y) + 1] = 1;//waveA[(int)(m_texWidth * x) - 1, (int)(m_texHeight * y)  - 1] = 1;//waveA[(int)(m_texWidth * x) - 1, (int)(m_texHeight * y) + 1] = 1;//waveA[(int)(m_texWidth * x)  + 1, (int)(m_texHeight * y) - 1] = 1;//waveA[(int)(m_texWidth * x)  + 1, (int)(m_texHeight * y)  + 1] = 1;}public void PopWater(){waveA[(int)(m_texWidth / 2), (int)(m_texHeight / 2)] = 1;waveA[(int)(m_texWidth / 2) - 1, (int)(m_texHeight / 2)] = 1;waveA[(int)(m_texWidth / 2) + 1, (int)(m_texHeight / 2)] = 1;waveA[(int)(m_texWidth / 2), (int)(m_texHeight / 2) - 1] = 1;waveA[(int)(m_texWidth / 2), (int)(m_texHeight / 2) + 1] = 1;waveA[(int)(m_texWidth / 2) - 1, (int)(m_texHeight / 2) - 1] = 1;waveA[(int)(m_texWidth / 2) - 1, (int)(m_texHeight / 2) + 1] = 1;waveA[(int)(m_texWidth / 2) + 1, (int)(m_texHeight / 2) - 1] = 1;waveA[(int)(m_texWidth / 2) + 1, (int)(m_texHeight / 2) + 1] = 1;}void Update(){ComputeWave();if (Input.GetMouseButtonDown(0)){RaycastHit rh;if (Physics.Raycast(m_waterCam.ScreenPointToRay(Input.mousePosition), out rh)){Debug.Log("我点击了!!!!");//PopWater(rh.textureCoord);PopWater();}}time = (int)Time.deltaTime * 1000;}void OnDestroy(){f = false;}bool f = true;void ThreadWave(){while (f){Thread.Sleep(time);for (int w = 1; w < m_texWidth - 1; w++){for (int h = 1; h < m_texHeight - 1; h++){waveB[w, h] =(waveA[w - 1, h] +waveA[w + 1, h] +waveA[w, h - 1] +waveA[w, h + 1] +waveA[w - 1, h - 1] +waveA[w + 1, h - 1] +waveA[w - 1, h + 1] +waveA[w + 1, h + 1]) / 4 - waveB[w, h];float value = waveB[w, h];if (value > 1){waveB[w, h] = 1;}if (value < -1){waveB[w, h] = -1;}if (value > -0.0001 && value < 0.0001){waveB[w, h] = 0;}float offset_u = (waveB[w - 1, h] - waveB[w + 1, h]) / 2;float offset_v = ((waveB[w, h - 1]) - waveB[w, h + 1]) / 2;float r = offset_u / 2 + 0.5f;float g = offset_v / 2 + 0.5f;Color c = new Color(r, g, 0);waveB[w, h] -= waveB[w, h] * decrement;allColor[w + m_texWidth * h] = c;}}float[,] temp;temp = waveA;waveA = waveB;waveB = temp;}}private Color[] allColor;void ComputeWave(){m_waterTexture.SetPixels(allColor);m_waterTexture.Apply();}}

3.步骤:
(1)、首先创建一个unity工程,创建一个物体cube,创建两个脚本,一个名为water的c#脚本,一个名为water的shader脚本,把上面的代码分别复制到相应的脚本里。
(2)、把相机改为正交,把C#脚本挂载到cube上

water Texture里面拖一张图片,Water Cam里拖上主相机,
(3)、选中shader脚本创建材质,然后,把这个材质也拖拽到cube上,

(4)、在材质上添加一个图片。

运行,用鼠标不停的点击cube这样就会水波纹的效果了。
哈哈,是不是很简单呢!喜欢博主的加关注哦!你们的阅读,和关注,是我最大的动力呢!
好了,今天小仙女,我就分享到这里咯,明天见。

生命不止,学习不知!

用shader做水波纹效果相关推荐

  1. 用shader实现屏幕波纹效果

    本文转载自http://blog.csdn.net/puppet_master/article/details/52975666 一.简介 最近在打黑魂,被虐得死去活来,每次都是想砸电脑的节奏,然而还 ...

  2. android自定义水波纹,Android自定义View——实现水波纹效果类似剩余流量球(示例代码)...

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  3. html5 水波式按钮_css3+jQuery实现按钮水波纹效果

    水波纹按钮 /*自定义按钮样式*/ .btns{ height: 30px; line-height: 30px; text-align: center; width: 200px; color: # ...

  4. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球

    Android自定义View--实现水波纹效果类似剩余流量球 三个点   pre   ber   block   span   初始化   move   理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...

  5. 聊聊Android5.0中的水波纹效果

    水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ...

  6. Android自定义View——实现水波纹效果类似剩余流量球

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  7. Android点击水波纹扩散效果整理(附带一个自定义的水波纹效果控件)

    很久很久没有写博客了,说来也有点惭愧.正好最近整理自己的项目工程目录,看到一些值得分享的控件,准备在之后的几篇博客中准备把它们陆续搬运上来. 这篇博客准备整理一下Android Material De ...

  8. 点击水波纹效果html5,使用CSS实现逼真的水波纹点击效果

    这篇文章特别介绍如何使用CSS来完成水波纹的效果. div的层层叠叠 虽然webkit具有遮罩的能力(webkit mask),不过webkit虽然强大,但在跨浏览器上总是它的罩门,况且在性能上也是往 ...

  9. android水波效果,android动态壁纸中的水波纹效果

    [实例简介] android动态壁纸中的水波纹效果,采用opengl中的shader实现 [实例截图] [核心代码] @Override public String getVertexShader() ...

最新文章

  1. Tomcat安全加固
  2. 基于supersocket、C#对JT808协议进行解析构建gps监控平台服务端
  3. 还找不到数据异常原因?这份教程赶快拿走
  4. Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
  5. explain 之 id
  6. 打开mobilenet——ssd的demo.py显示这样的错误解决方法:Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.s
  7. hibernate组件映射
  8. mysql insert 运算_MySql insert插入操作的3个小技巧分享
  9. Symfony2插件FOSUserBundle的使用说明
  10. 《Blender权威指南》
  11. Java反编译xml实现_如何反编译apk文件得到源码和XML文件
  12. 带妹妹学密码系列4---流密码(ZUC)
  13. 最优化算法之粒子群算法(PSO)
  14. Java操作xls文件,数据去重
  15. 最新数据库驱动包下载(完整版)
  16. 互联网晚报 | 11/21 星期一 | 31省平均工资发布;​九城不排除重新接盘暴雪魔兽世界;iPhone14Pro发货再次延期...
  17. 卡迈克尔(Carmichael)函数
  18. 【小技巧】解决你的Mac电脑报名教师资格证,为什么一直进不去?
  19. 给linux文件夹设置权限
  20. [nova]nova api执行过程分析

热门文章

  1. GridView/DataGrid行单击和双击事件实现代码_.Net教程
  2. 上课笔记-运营管理(一)
  3. JMDM-2011 投币刷卡一体式自动售水机控制系统
  4. LVS (负载均衡、keepalived、lvs高可用)
  5. 选课策略——0-1整数规划
  6. 猜1-100数字游戏
  7. 清华裴丹:我在智能运维科研领域的一些思考
  8. PCIe X1 插槽的主要用途是什么?
  9. html5 2d小游戏,GitHub - pepsin/cax: HTML5 Canvas 2D Rendering Engine - 小程序、小游戏以及 Web 通用 Canvas 渲染引擎...
  10. 史上最全挤出模具知识汇总