1.水实现的效果:用到的知识点有点多。
(1)水的深浅影响透明度和颜色,浅处能看到水底:深度图
(2)反射和折射:菲涅尔,GrabPass截屏,cubeMap,噪声贴图
(3)水面波纹荡漾:切线空间法线扰动
(3)高光和漫反射:diffuse 和 specular
(4)波浪:切线空间法线扰动
(5)水的半透明:Transparent
效果图:(最后附百度云demo资源)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200521010408620.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pzMDkwNw==,size_16,color_FFFFFF,t_70

Shader "Unlit/water_unitl"
{Properties{_MainTex ("Texture", 2D) = "white" {}_WaterColor01("water Color 01",Color)=(1,1,1,1)_WaterColor02("water Color 02",Color)=(1,1,1,1)_TranAmount("TransAmount",Range(0,100))=5_DepthRange("Depth Range",Range(1,100))=1// bumpMap_NormalTex ("bump map",2D) = "bump" {}_WaterSpeed("Water speed",float) = 5_BumpSacle("bump scale",float) = 1_Specular ("Specualr",Color) = (1,1,1,1)_Gloss("Gloss",Range(0,256))=8//波浪_WaveTex("WaveTex",2D) = "white" {}_NoiseTex("Noise",2D) = "white" {}_WaveSpeed("Wave speed",float) = 1_WaveRange("wave range",float) = 0.5_WaveRangeA("wave rangeA",float) = 1_WaveDetal("wave offset  Detal",float) = 0.5// grabpass_Distortion("Distortion",float) = 1// cubemap_CubeMap("CubeMap",Cube) = "SkyBox"{}_FresnelSacle("Fresnel Sacle",float) = 1}SubShader{Tags { "RenderType"="Opaque" "Queue"="Transparent"}LOD 100Blend SrcAlpha OneMinusSrcAlphaZWrite offGrabPass {"_GrabPassTex"}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D_float _CameraDepthTexture;fixed4 _WaterColor01;fixed4 _WaterColor02;float _TranAmount;float _DepthRange;sampler2D _NormalTex;float4 _NormalTex_ST;float _BumpSacle;float _WaterSpeed;float4 _Specular;float _Gloss;sampler2D _WaveTex; float4 _WaveTex_ST;sampler2D _NoiseTex; float4 _NoiseTex_ST;float _WaveSpeed;float _WaveRange;float _WaveRangeA;float _WaveDetal;sampler2D _GrabPassTex;float4 _GrabPassTex_TexelSize;float _Distortion;samplerCUBE _CubeMap;float _FresnelSacle;struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;float4 tangent : TANGENT;};struct v2f{float2 uv : TEXCOORD0;                float4 pos : SV_POSITION;float4 proj : TEXCOORD1;float2 uv_NormalTex : TEXCOORD2;float4 TtoW0 : TEXCOORD3;float4 TtoW1 : TEXCOORD4;float4 TtoW2 : TEXCOORD5;LIGHTING_COORDS(6,7) //阴影+衰减float2 uv_WaveTex : TEXCOORD8;float2 uv_NoiseTex : TEXCOORD9;};v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.uv_NormalTex = TRANSFORM_TEX(v.uv, _NormalTex);o.uv_WaveTex = TRANSFORM_TEX(v.uv, _WaveTex);o.uv_NoiseTex = TRANSFORM_TEX(v.uv, _NoiseTex);o.proj = ComputeScreenPos(o.pos);COMPUTE_EYEDEPTH(o.proj.z);float3 worldPos = mul(unity_ObjectToWorld,v.vertex);float3 tangent = UnityObjectToWorldDir(v.tangent.xyz);float3 normal = UnityObjectToWorldNormal(v.normal);float3 biTangent = cross(tangent,normal) * v.tangent.w;o.TtoW0 = fixed4(tangent.x,biTangent.x,normal.x,worldPos.x);o.TtoW1 = fixed4(tangent.y,biTangent.y,normal.y,worldPos.y);o.TtoW2 = fixed4(tangent.z,biTangent.z,normal.z,worldPos.z);//包含光照衰减和阴影             TRANSFER_VERTEX_TO_FRAGMENT(o);return o;}fixed4 frag (v2f i) : SV_Target{half depth = LinearEyeDepth(tex2Dproj(_CameraDepthTexture,UNITY_PROJ_COORD(i.proj)).r);half deltaDepth = depth - i.proj.z;// sample the textureUNITY_PROJ_COORD()i.projfixed4 col = lerp(_WaterColor01,_WaterColor02,min(_DepthRange,deltaDepth)/_DepthRange); //tex2D(_MainTex, i.uv);col.a = min(_TranAmount,deltaDepth)/_TranAmount;// col.a * _TranAmount;// normalfloat4 bumpOffset1 = tex2D(_NormalTex,i.uv_NormalTex + float2(_WaterSpeed * _Time.y,0));float4 bumpOffset2 = tex2D(_NormalTex,float2( 1 - i.uv_NormalTex.y,i.uv_NormalTex.x) + float2(_WaterSpeed * _Time.y/10,0));float4 offsetColor = (bumpOffset1 + bumpOffset2)/2;float3 normal = UnpackNormal(offsetColor);normal.xy *= _BumpSacle;                float4 bumpColor1 = tex2D(_NormalTex,i.uv_NormalTex + normal.xy + float2(_WaterSpeed * _Time.y,0));float4 bumpColor2 = tex2D(_NormalTex,float2( 1 - i.uv_NormalTex.y,i.uv_NormalTex.x) + normal.xy + float2(_WaterSpeed * _Time.y/10,0));normal = UnpackNormal((bumpColor1 + bumpColor2)/2).xyz;fixed2 offset = normal.xy;normal = normalize(half3(dot(i.TtoW0.xyz,normal),dot(i.TtoW1.xyz,normal),dot(i.TtoW2.xyz,normal)));//光照参数float3 worldPos = float3(i.TtoW0.w,i.TtoW1.w,i.TtoW2.w);float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));float3 worldLightDir = normalize(UnityWorldSpaceLightDir(worldPos));float3 halfDir = normalize(worldLightDir + worldViewDir);//包含光照衰减以及阴影,但是base光源一般没有衰减UNITY_LIGHT_ATTENUATION(atten, i, worldPos);float3 diffuseFactor = max(0, dot(normal,worldLightDir));float3 specualrFactor = pow(max(0,dot(normal,halfDir)),_Gloss);col.rgb = atten * (col.rgb * _LightColor0.rgb * diffuseFactor + _Specular.rgb * specualrFactor * _LightColor0.rgb);col.a = col.a + _Specular.a * specualrFactor;// 波浪float waveA = 1 - min(_WaveRangeA,deltaDepth) / _WaveRangeA; fixed4 noiseColor = tex2D(_NoiseTex,i.uv_NoiseTex);fixed4 waveColor1 = tex2D(_WaveTex,float2(waveA + _WaveRange * sin(_Time.x * _WaveSpeed + noiseColor.r),1 )+ offset);waveColor1.rgb *= (1-(sin(_Time.x * _WaveSpeed + noiseColor.r)+1)/2) * noiseColor.r;fixed4 waveColor2 = tex2D(_WaveTex,float2(waveA + _WaveRange * sin(_Time.x * _WaveSpeed + _WaveDetal + noiseColor.r),1)+offset);waveColor2.rgb *= (1-sin(_Time.x * _WaveSpeed + _WaveDetal + noiseColor.r)+1)/2 * noiseColor.r; col.rgb = col.rgb + (waveColor1.rgb + waveColor2.rgb) * waveA;//grabpass计算折射//对屏幕图像的采样坐标进行偏移//选择使用切线空间下的法线方向来进行偏移是因为该空间下的法线可以反映顶点局部空间下的法线方向offset = offset * _Distortion * _GrabPassTex_TexelSize.xy;//对scrPos偏移后再透视除法得到真正的屏幕坐标i.proj.xy = offset * i.proj.z + i.proj.xy;fixed3 refraCol = tex2D(_GrabPassTex,i.proj.xy/i.proj.w).rgb;//反射fixed3 reflectDir = reflect(-worldViewDir,normal);fixed3 reflection = texCUBE(_CubeMap,reflectDir);fixed3 fresnel = _FresnelSacle + (1-_FresnelSacle) * pow(1 - dot(worldViewDir,normal),5);fixed3 refraAndRefle = lerp(reflection,refraCol,fresnel);col.rgb *= refraAndRefle;return col;}ENDCG}}
}

百度云:链接: https://pan.baidu.com/s/1GcPiJpRXJMzskUNbcbkTXA 提取码: 9yhk
环境是unity2019.2.12f1

unity-shader 水的效果WaterEffect相关推荐

  1. Unity Shader 窗前雨滴效果衍生(表面水滴附着)

    Unity Shader 窗前雨滴效果衍生(表面水滴附着) 霓虹中国视频截图 现实中的水珠附着效果 实现思路 1.首先创建一个Cube来作为实现效果的物体 2.创建一个Shader开始着色器的编写 实 ...

  2. Unity Shader·屏幕破碎效果

    Unity Shader·屏幕破碎效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...

  3. 【Unity Shader实例】 水体WaterEffect(二) 用贴图和uv动画模拟水效

    Unity Shader实现简单水体效果 效果展示 原理 用贴图和uv动画模拟水效实现"假"水. 设计 找一张水波的贴图,处理它的uv值,让贴图流动起来.这样就用静态纹理和uv动画 ...

  4. Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)

    综合效果 经过各元素叠加 和 程序的审美调参 后的综合效果 交互的水波与边缘浪花的合并需要优化一下 反射 两种方案: cubeMap 以水面对称设一个摄像机 cubeMap 实现:反射探针生成Cube ...

  5. 【Unity Shader实例】 水体WaterEffect(一) 设计

    Unity Shader 水体效果实现的设计 在设计水体效果的实现方案之前,我们先参考一下大神们写好的精彩的例子,比如DCG Water Shader的效果,这也是我们努力的目标. 好!~ 现在开始实 ...

  6. Unity Shader 之 透明效果

    本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...

  7. Unity Shader - 翻书效果

    今天实现一个简单的翻书的效果,话不多说,先上一张效果图: 这里就随便用的一张纹理了,我们还是称为"翻木板"吧,哈哈. 实现过程: 其实这个效果实现起来还是挺简单的,大概思路其实就是 ...

  8. unity shader 抖音效果

    最近开始学习了unity shader,所以想要做一些简单的效果,来巩固一下知识.我第一个想做的就是做一些类似于抖音的效果.(PS:最近学习了markdown,所以就用markdown开始写博客了 ) ...

  9. Unity Shader 实现鬼魂效果

    Shader 实现鬼魂效果 前言 前言 我们在游戏中经常会角色碰到角色的情况,大多数游戏中角色和角色重叠的时候会显示一个虚幻的鬼影而不是完全遮挡,那么这个鬼影效果怎么实现呢?接下来我们就实现这样的一个 ...

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

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

最新文章

  1. 通过gdb core dump方法查看程序异常时的堆栈信息
  2. px、em、rem、vw、vh、vm、rpx这些单位的
  3. MATLAB批量实现dicom转换为bmp格式
  4. P3391 【模板】文艺平衡树(Splay)
  5. 2020年, image captioning论文汇总
  6. kafka基本操作:创建topic、生产/消费消息(同一消费组均分消息;不同消费组订阅消息)
  7. Python 日期时间相关
  8. oracle xml文件是什么文件,介绍关于Oracle下存取XML格式数据的方式
  9. android 判断listview是否为空,ListView为空时显示空视图
  10. bzoj4546-codechef XRQRS(可持久化Trie)
  11. javascript创建面包屑路径
  12. 2020 年,从架构谈起,到 Mesh 结束
  13. 区块链教程Fabric1.0源代码分析Ledger(账本)二
  14. 中国咖啡机市场运行现状调研及投资战略分析报告2022-2027年
  15. AI红包皮速领,人类现金速抽|祝大家新春快乐
  16. 【IoT】卫朋:6000+ 字解读 | 2022年产品人必备的7个产品管理工具(1.0版)
  17. 支付宝支付接口的调用(支付宝支付的实现)
  18. 【批处理DOS-CMD命令-汇总和小结】-cmd扩展命令、扩展功能(cmd /e:on、cmd /e:off)
  19. LSM-Tree介绍
  20. MyCat Catlet实现 详解

热门文章

  1. win配置pm2开机自启node项目
  2. git在idea中的冲突解决(非常重要)
  3. 怎样改变照片大小?免费在线图片压缩方法
  4. 用于Excel 2017的CData ODBC驱动程序 Linux DSN配置
  5. android简单即时聊天sdk
  6. 如何搭建用户体验指标体系?
  7. mark:Kafka
  8. GIS制图的基础三点
  9. kafka文档: 配置选项翻译
  10. 1-C语言 8皇后问题 (For循环解法)