这个泡沫效果来自远古时代的Unity官方海岛Demo, 原效果直接复制3个材质球在js脚本中做UV动画偏移,这里尝试在shader中做动画并且一个pass中完成:

  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. //岸边浪花泡沫
  3. //CloudLty 2016-9-6
  4. Shader "Custom/foams2"
  5. {
  6. Properties//标记所以外部变量,让该变量按标记显示在编辑器中
  7. {
  8. _TintColor ("Tint Color (RGBA)", Color) = (1,1,1,1)
  9. _MainTex ("Texture (RGB)", 2D) = "white" {}
  10. _Mask ("Mask", 2D) = "white" {}
  11. _AlphaDelay ("Alpha Delay", Range(-1,1)) = 0
  12. _Speed ("Time Scale", Range(0,1)) = 0.25
  13. _WaveRange ("Wave Range", Range(-1,1)) = 0.6
  14. _Layer1OffsetX ("Layer1 Offset X", Range(-2,2)) = 0
  15. _Layer2OffsetX ("Layer2 Offset X", Range(-2,2)) = 0
  16. _Layer3OffsetX ("Layer3 Offset X", Range(-2,2)) = 0
  17. _Layer1OffsetY ("Layer1 Offset Y", Range(-2,2)) = 0
  18. _Layer2OffsetY ("Layer2 Offset Y", Range(-2,2)) = 0
  19. _Layer3OffsetY ("Layer3 Offset Y",Range(-2,2)) = 0
  20. }
  21. SubShader
  22. {
  23. Tags
  24. {
  25. "Queue" = "Transparent"
  26. "IgnoreProjector" = "True"
  27. "RenderType" = "Transparent"
  28. }
  29. LOD 100
  30. Pass
  31. {
  32. ZWrite off
  33. Blend srcAlpha OneMinusSrcAlpha
  34. CGPROGRAM
  35. #pragma vertex vert //顶点着色器 类似于宏定义,告诉Unity这个函数名是顶点做色器函数
  36. #pragma fragment frag //片段着色器
  37. #include "UnityCG.cginc" //类似头文件?主要是Untiy提供的一些常用函数 貌似不写编译时也会自动包含进来
  38. //顶点着色器输入结构体
  39. struct appdata
  40. {
  41. float4 vertex : POSITION; //POSITION输入语义,Unity将顶点坐标提交于此变量
  42. float4 uv : TEXCOORD0; //TEXCOORD0,Unity将模型第一套UV提交于此变量
  43. };
  44. //顶点着色器输出结构体 (反正会给片段做色器使用)
  45. struct v2f
  46. {
  47. UNITY_FOG_COORDS(1)
  48. float4 vertex : SV_POSITION;//输出语义
  49. float4 uv1 : TEXCOORD0;
  50. float4 uv2 : TEXCOORD1;
  51. float4 uv3 : TEXCOORD2;
  52. float2 uv4 : TEXCOORD3;
  53. };
  54. //外部变量声明
  55. uniform sampler2D _MainTex;
  56. uniform float4 _MainTex_ST;
  57. uniform sampler2D _Mask;
  58. uniform float4 _Mask_ST;
  59. uniform half4 _TintColor;
  60. uniform float _AlphaDelay;
  61. uniform float _Speed;
  62. uniform float _WaveRange;
  63. uniform float _Layer1OffsetX;
  64. uniform float _Layer2OffsetX;
  65. uniform float _Layer3OffsetX;
  66. uniform float _Layer1OffsetY;
  67. uniform float _Layer2OffsetY;
  68. uniform float _Layer3OffsetY;
  69. //UV动画函数
  70. float2 DelayOffsetUV(float2 uv, float offset, float offset_y)//输入UV 和偏移量(x,y),外部变量控制速度,范围
  71. {
  72. float pi = 3.1415926536f;
  73. float sintime = sin(_Time.y * _Speed * pi + offset * 0.5f * pi);//余弦函数使UV来回移动,
  74. float u = (sintime + 1) * 0.5f * _WaveRange + (1 - _WaveRange);
  75. uv.x += u;
  76. uv.y += offset_y;
  77. return uv;
  78. }
  79. //顶点着色器
  80. v2f vert(appdata v)
  81. {
  82. v2f o;
  83. o.vertex = UnityObjectToClipPos(v.vertex);
  84. //逐层偏移
  85. float2 inuv = v.uv;
  86. // layer1 uv offset
  87. float2 uv_tex1 = DelayOffsetUV(inuv, _Layer1OffsetX, _Layer1OffsetY);
  88. o.uv1.xy = TRANSFORM_TEX(uv_tex1, _MainTex);
  89. // layer1 uv offset
  90. float2 uv_tex2 = DelayOffsetUV(inuv, _Layer2OffsetX, _Layer2OffsetY);
  91. o.uv1.zw = TRANSFORM_TEX(uv_tex2, _MainTex);
  92. // layer1 uv offset
  93. float2 uv_tex3 = DelayOffsetUV(inuv, _Layer3OffsetX, _Layer3OffsetY);
  94. o.uv2.xy = TRANSFORM_TEX(uv_tex3, _MainTex);
  95. //每一层的Mask(透贴)偏移,偏移量与tex一致,并可以用_AlphaDelay微调
  96. // mask1 uv offset
  97. float2 uv_mask1 = DelayOffsetUV(inuv, _Layer1OffsetX - _AlphaDelay, _Layer1OffsetY);
  98. o.uv2.zw = TRANSFORM_TEX(uv_mask1, _Mask);
  99. // mask2 uv offset
  100. float2 uv_mask2 = DelayOffsetUV(inuv, _Layer2OffsetX - _AlphaDelay, _Layer2OffsetY);
  101. o.uv3.xy = TRANSFORM_TEX(uv_mask2, _Mask);
  102. // mask3 uv offset
  103. float2 uv_mask3 = DelayOffsetUV(inuv, _Layer3OffsetX - _AlphaDelay, _Layer3OffsetY);
  104. o.uv3.zw = TRANSFORM_TEX(uv_mask3, _Mask);
  105. UNITY_TRANSFER_FOG(o,o.vertex);
  106. o.uv4 = inuv;
  107. return o;
  108. }
  109. //获取泡沫逐渐出现,向岸边移动,开始折返并逐渐消失的透明度值
  110. fixed GetDisappearAlpha(float delay)
  111. {
  112. float PI = 3.1415926536f;
  113. float t = _Time.y *_Speed * PI + delay * 0.5* PI + 1.2 * PI;
  114. fixed a = (sin(t)+1)*0.5;
  115. return a*a;
  116. }
  117. //将两层半透明的颜色合并,获取合并后的RGBA
  118. fixed4 TwoColorBlend(fixed4 c1, fixed4 c2)
  119. {
  120. fixed4 c12;
  121. c12.a = c1.a + c2.a - c1.a * c2.a;
  122. c12.rgb = (c1.rgb * c1.a * (1 - c2.a) + c2.rgb * c2.a) / c12.a;
  123. return c12;
  124. }
  125. //片段着色器
  126. fixed4 frag(v2f i) : SV_Target //参数为输入结构体,语义就是输出到什么地方
  127. {
  128. fixed pi = 3.1415926536f;
  129. //get rgb
  130. fixed4 c1 = tex2D(_MainTex, i.uv1.xy);
  131. fixed4 c2 = tex2D(_MainTex, i.uv1.zw);
  132. fixed4 c3 = tex2D(_MainTex, i.uv2.xy);
  133. //get alpha
  134. c1.a = tex2D(_Mask, i.uv2.zw) * GetDisappearAlpha(_Layer1OffsetX);
  135. c2.a = tex2D(_Mask, i.uv3.xy) * GetDisappearAlpha(_Layer2OffsetX);
  136. c3.a = tex2D(_Mask, i.uv3.zw) * GetDisappearAlpha(_Layer3OffsetX);
  137. //layer1 + layer2
  138. fixed4 c12 = TwoColorBlend(c1,c2);
  139. //layer12 + layer3
  140. fixed4 c123 = TwoColorBlend(c12,c3);
  141. return c123 * _TintColor;
  142. }
  143. ENDCG
  144. }
  145. }
  146. }

Unity Shader学习笔记 - 用UV动画实现沙滩上的泡沫的更多相关文章

  1. Unity Shader学习笔记-1

    本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...

  2. 【Unity Shader学习笔记】Unity基础纹理-法线贴图

    1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...

  3. 【Unity Shader学习笔记】Unity基础纹理-单张纹理

    1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...

  4. 【Unity Shader学习笔记】Unity基础纹理-渐变纹理

    纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因 ...

  5. Unity Shader 学习笔记(一)

    _MainTex_ST (1)简单来说,TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)主要作用是拿顶点的uv去和材质球的t ...

  6. 【Unity Shader学习笔记】Unity光照基础-高光反射

    1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...

  7. 【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

    在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律 ...

  8. 【Unity Shader学习笔记】Unity光照基础-漫反射光照

    本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...

  9. unity shader学习笔记(1) shader基础结构以及Properties面板

    首先是shader的基础结构: Shader "Custom/Example { Properties//变量属性面板 { } SubShader { Tags { "Render ...

随机推荐

  1. sql传统的拼接带来的危害

    现在大家来学习下sql是如何注入的,传统的拼接字符串会造成 注入形式就是在变量那使用<1=1>这样查询无论怎样都是正确的 -- var sql = "select name fr ...

  2. POJ 1328 Radar Installation(很新颖的贪心,区间贪心)

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 106491   Accepted: 2 ...

  3. HDU 2021 发工资咯:)(最水贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    ...

  4. HSL与RGB颜色转换

    /** * HSL颜色值转换为RGB. * 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space. * h, s, 和 l 设定在 [0, 1] 之 ...

  5. .Net core 下Swagger如何隐藏接口的显示

    Swagger是这个非常强大的api文档工具,通常可以用来测试接口,和查看接口,就像这样: 非常的好用和快捷,这是一个小小的demo,我们在完成系统时,发布后,外部依旧可以用/swagger访问到这个 ...

  6. 虚拟机(unbutun16.04)设置静态ip

    电脑上装了虚拟机,想用xshell连接,无奈按照默认的网络设置方式每次重启了虚拟机后都要修改ip才能访问,这怎么能忍,经过一番折腾终于搞定这个问题了,解决步骤如下: 大步骤分为两步:其一是主机的设置, ...

  7. Java中常见的比较

    一.StringBuffer.StringBuilder.String 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBu ...

  8. VUE通过索引值获取数据不渲染的问题

    问题:vue里面当通过索引值获取数据时,ajax数据成功返回,但是在火狐下不渲染 解决:

  9. SaltStack error: No module named 'salt'

    启动saltstack的时候出现下面的错误 问题原因 是因为我在centos7中安装了多版本的python导致的 解决方案 将文件下面文件首行更改成python2 [root@saltstack-12 ...

  10. kali aquatone安装

    https://www.jianshu.com/p/418eedb9d9c8