水流的模拟主要运用了顶点变换和纹理动画的结合;

顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等。

纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果。

脚本如下:

  1. Shader "MyUnlit/ScrollWater"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _Color("Color Tint",color)=(,,,)
  7. //控制水流波动的幅度,也就是三角函数中的振幅(值域范围)
  8. _Magnitude("Distortion Magnitude",float)=0.3
  9. //控制周期的长度,值越大,周期越短,频率越高
  10. _InvWaveLength("Distortion Inserve Wave Length",float)=
  11. //流动速度,用于纹理变换
  12. _Speed("Speed",float)=0.1
  13. }
  14. SubShader
  15. {
  16. //顶点动画需要禁用合P处理
  17. Tags {"Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="true" "DisableBatching"="True"}
  18.  
  19. Pass
  20. {
  21. //透明度混合:关闭深度写入+设置混合状态+禁用剔除(双面渲染)
  22. Tags{"lightmode"="forwardbase"}
  23. ZWrite off
  24. Blend SrcAlpha OneMinusSrcAlpha
  25. Cull off
  26.  
  27. CGPROGRAM
  28. #pragma vertex vert
  29. #pragma fragment frag
  30. #pragma multi_compile_fog
  31.  
  32. #include "UnityCG.cginc"
  33. struct appdata
  34. {
  35. float4 vertex : POSITION;
  36. float2 uv : TEXCOORD0;
  37. };
  38.  
  39. struct v2f
  40. {
  41. float2 uv : TEXCOORD0;
  42. UNITY_FOG_COORDS()
  43. float4 vertex : SV_POSITION;
  44. };
  45.  
  46. sampler2D _MainTex;
  47. float4 _MainTex_ST;
  48. fixed4 _Color;
  49. float _Magnitude;
  50. float _InvWaveLength;
  51. float _Speed;
  52.  
  53. v2f vert (appdata v)
  54. {
  55. v2f o;
  56. float4 offset;
  57. //这里的方向可以自己选择,这里选择偏移x方向,其他方向的偏移保持不变
  58. offset.yzw = float3(, , );
  59. //利用正弦函数模拟河流整体的形状,最后乘以振幅
  60. offset.x = sin((v.vertex.x + v.vertex.y + v.vertex.z)*_InvWaveLength)*_Magnitude;
  61. o.vertex = UnityObjectToClipPos(v.vertex+offset);
  62. //对uv进行某一方向的滚动以模拟水流,这里选择v向
  63. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  64. o.uv += float2(0.0, _Time.y*_Speed);
  65.  
  66. UNITY_TRANSFER_FOG(o,o.vertex);
  67. return o;
  68. }
  69.  
  70. fixed4 frag (v2f i) : SV_Target
  71. {
  72. fixed4 col = tex2D(_MainTex, i.uv);
  73. col.rgb *= _Color.rgb;
  74. UNITY_APPLY_FOG(i.fogCoord, col);
  75. return col;
  76. }
  77. ENDCG
  78. }
  79. }
  80. FallBack "Transparent/VertexLit"
  81. }

P.S.需要把纹理的导入设置改为Repeat(重复)

效果如下:

Unity Shader 2D水流效果的更多相关文章

  1. Unity Shader 之 透明效果

    透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...

  2. Unity Shader实现描边效果

    http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...

  3. Unity Shader 屏幕后效果——颜色校正

    屏幕后效果指的是,当前整个场景图已经渲染完成输出到屏幕后,再对输出的屏幕图像进行的操作. 在Unity中,一般过程通常是: 1.建立用于处理效果的shader和临时材质,给shader脚本传递需要控制 ...

  4. Unity Shader 屏幕后效果——全局雾

    Unity内置的雾效需要在每个shader中分别编写,造成了极大的不便.这里利用屏幕后处理产生可单独控制且自由度更高的雾效. 屏幕后雾效的本质在于,通过深度纹理重构出每个像素在世界空间中的位置,根据得 ...

  5. Unity Shader 屏幕后效果——景深

    景深效果的原理是,在摄像机的近裁剪平面和远裁剪平面之间可以设置一个焦距,在这个距离所在的平面上的物体最为清晰,而这个距离之前或之后的物体成像是一种模糊状态(根据距离逐渐模糊,最终达到最为模糊的状态). ...

  6. Unity Shader 屏幕后效果——Bloom外发光

    Bloom的原理很简单,主要是提取渲染图像中的亮部区域,并对亮部区域进行模糊处理,再与原始图像混合而成. 一般对亮部进行模糊处理的部分采用高斯模糊,关于高斯模糊,详见之前的另一篇博客: https:/ ...

  7. Unity Shader 屏幕后效果——高斯模糊

    高斯模糊是图像模糊处理中非常经典和常见的一种算法,也是Bloom屏幕效果的基础. 实现高斯模糊同样用到了卷积的概念,关于卷积的概念和原理详见我的另一篇博客: https://www.cnblogs.c ...

  8. Unity Shader 屏幕后效果——边缘检测

    关于屏幕后效果的控制类详细见之前写的另一篇博客: https://www.cnblogs.com/koshio0219/p/11131619.html 这篇主要是基于之前的控制类,实现另一种常见的屏幕 ...

  9. Unity Shader 屏幕后效果——摄像机运动模糊(速度映射图实现)

    速度映射图主要是为了得到每个像素相对于前一帧的运动矢量,其中一种方法是使用摄像机的深度纹理来推导. 推导过程如下: 先由深度纹理逆推出NDC(归一化的设备坐标)下的顶点坐标,利用VP矩阵(视角*投影矩 ...

随机推荐

  1. 配置IIS网站可以下载.apk/.ipa文件

    添加 扩展名是:.apk MIMI类型是:application/vnd.android.package-archive 扩展名是:.ipa MIMI类型是:application/iphone

  2. Python - Socket网络编程 - 第二十六天

    网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...

  3. Flask笔记:文件上传

    文件上传 enctype:在HTML中的form表单中form标签默认是`enctype="application/x-www-form-urlencoded"`,在文件上传时需要 ...

  4. MySQL基础(二)(约束以及修改数据表)

    一,约束以及修改数据表 约束的作用?1.约束保证数据的完整性.一致性:2.约束分为表级约束.列级约束:3.约束类型包括:NOT NULL(非空约束).PRIMARY KEY(主键约束).UNIQUE ...

  5. Winform中设置ZedGraph鼠标双击获取距离最近曲线上的点的坐标值

    场景 WInforn中设置ZedGraph的焦点显示坐标格式化以及显示三个坐标数的解决办法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  6. 记一次CTF出题WP

    笔者有幸参与一次CTF入门级的出题,在此记录一下WP 1.测试你得手速 1.用IDA打开程序 找到单击次数, 获取全局变量地址. 打开程序 打开OllyDbg attcach后在左下角按CTRL+N ...

  7. php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpos

    php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpossubstr_count($haystack, $needle [,$o ...

  8. Web点击链接调起手机系统自带短信发短信

    实现代码如下: 一.Html代码 <a href="javascript:;" class="xq-sms">发送短信</a> 二.jQ ...

  9. [b0014] HDFS 常用JAVA 操作实战

    目的: 学习用java进行的常用hdfs操作 参考: [b0002] Hadoop HDFS cmd常用命令练手 环境: hadoop2.6.4 win7 下的eclipse环境调试已经配置好,参考前 ...

  10. mysql dump备份 、 mysql还原操作练习

    1.备份mysql.dump 备份MySQL数据库的命令 mysqldump -h主机名 -u用户名 -p密码 数据库名字 > 备份的数据库名字.sql 例子: mysqldump -uroot ...