综合效果

经过各元素叠加 和 程序的审美调参 后的综合效果
交互的水波与边缘浪花的合并需要优化一下

反射

两种方案:

  1. cubeMap
  2. 以水面对称设一个摄像机

cubeMap

实现:反射探针生成CubeMap
特性:
● 对于近处的反射会有明显的错位
● 适用于对清晰度要求不高,性能要求高的情况

设置反射摄像机

原理:在平面对称镜头摄像机的位置,建一个反射摄像机,渲染反射贴图。shader用屏幕坐标对反射贴图采样即可得到镜像

反射贴图:

//---------- 反射 ---------float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));float3 tangentNormal = fixed3(0,0,1);//bump;//
//return fixed4(bump, 1);//看法线
fixed3 worldNormal = normalize(half3(dot(i.TtoW0.xyz, tangentNormal), dot(i.TtoW1.xyz, tangentNormal), dot(i.TtoW2.xyz, tangentNormal)));//------ cubeMap
// fixed4 texColor = tex2D(_MainTex, i.uv.xy + speed);
// fixed3 reflDir = reflect(-viewDir, worldNormal);
// fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb ;// * _Color.rgb;//------ 对称相机
float2 screenUV = i.scrPos.xy/i.scrPos.w - worldNormal.xz * _ReflDistortion*_Reflection_TexelSize.xy;
fixed4 texColor = tex2D(_MainTex, i.uv.xy + speed);
fixed3 reflCol = tex2D(_Reflection, screenUV).rgb  * _Color.rgb;//* texColor.rgbreturn fixed4(reflCol, 1);

折射

参考《入门精要》的实现:GrabPass获得水后图像,采样噪音纹理得到offset,然后转移到tangent空间做偏移,达到随机扭曲的效果

菲涅尔效应


水的F_0 为0.02

 fixed fresnel = pow(1 - saturate(dot(viewDir, worldNormal)), 4);// 水F0 ~= 0fixed3 reColor = reflCol * fresnel + refrCol * (1 - fresnel);

深浅

利用深度图、视线深度来实现

浪花/泡沫

  1. 利用深度差计算一个浪花强度:相当于提取出边缘
  2. 利用浪花强度来采样坡度贴图:

可以得到

3. 再叠加浪花纹理:

得到

4. 最终浪花效果:

//---------- 浪花 ---------float intensityFactor = 1 - saturate(deltaDepth / _FoamStrength);    half3 foamGradient = 1 - tex2D(_FoamGradient, float2(intensityFactor - _Time.y*0.2, 0) + bump.xy * 0.15);float2 foamDistortUV = bump.xy * 0.2;half3 foamTex = tex2D(_Foam, i.foamUV + foamDistortUV).rgb;fixed4 foamColor = fixed4(foamGradient * intensityFactor * foamTex, 1);

波浪

多种方案:

  1. 随时间扰动 噪音法线贴图
  2. flowmap 参考之前的文章
  3. Gerstner参考此文
  4. FFT参考此文

可交互

参考该项目

  1. 主要分为三个Shader:生成波浪Shader、传输波浪Shader、渲染波浪Shader;
    三张纹理图:传递波浪高度贴图、生成波浪高度贴图、前一帧高度贴图
    一个摄像机脚本:记录点击位置,传给生成波浪Shader
  2. 以传递波浪高度贴图作为载体,每次渲染 先叠加 生成波浪Shader生成的波浪高度贴图 ,再叠加 利用前一帧高度贴图在 传输波浪Shader算出的衰减高度(衰减参考波的传递公式),得到最终波浪高度贴图
  3. 在渲染波浪Shader中,采样波浪高度贴图,对顶点进行偏移;对片元插值波浪颜色

渲染Shader
顶点部分:

...
float4 localPos = v.vertex;
float2 waveUv = v.texcoord.xy;
float4 waveTransmit = tex2Dlod(_WaveResult, float4(waveUv, 0, 0));
float waveHeight = DecodeFloatRGBA(waveTransmit);localPos.y += waveHeight * _WaveScale;
float3 worldPos = mul(unity_ObjectToWorld, localPos);o.vertex = mul(UNITY_MATRIX_VP, float4(worldPos, 1));
...

片元部分:

...
float4 waveTransmit = tex2Dlod(_WaveResult, float4(i.uv.xy, 0, 0));
float waveHeight = DecodeFloatRGBA(waveTransmit) * _WaveScale;
return lerp(finalCol, _WaveColor, waveHeight);

TODO

水下3D

3D贴图?

焦散


用焦散法线噪音贴图来模拟?

散射

辉光

项目地址

参考资料

《Unity Shader入门精要》
https://blog.csdn.net/ZanDatsu/article/details/107865706
http://blog.sina.com.cn/s/blog_89d90b7c0102vgk1.html
https://github.com/dreamfairy/interactivity-waterplane
https://blog.csdn.net/LeoHiJack/article/details/78329543
https://www.youtube.com/watch?v=zD6GV6bZenM

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

  1. Unity shader Note :高级纹理(CubeMap反射折射菲涅尔,Rendermap镜子玻璃,程序纹理)

    1.Cubemap–反射折射 使用脚本来创建Cubemap ①通过Camera.RenderToCubemap 把任意位置观察到的场景图制作成一张Cubemap之中 ②脚本使用自定义编译窗体的命令 – ...

  2. Unity Shader:实现菲涅尔+色散效果的环境映射以及相关原理解析

    文章目录 1,色散在光学中的原理 2,反射的数学计算方法以及用它实现环境映射 3,折射的原理以及色散的实现 4,菲涅尔效果 5,拥有菲涅尔与色散效果的环境映射 1,色散在光学中的原理 复色光 --现实 ...

  3. Unity Shader:实现菲涅尔+色散效果以及相关原理解析

    1,色散在光学中的原理  2,反射的原理以及环境映射的实现  3,折射的原理以及色散的实现  4,菲涅尔效果  5,将菲涅尔与色散效果增加到环境映射中 1,色散在光学中的原理 复色光  --现实生活中 ...

  4. shader 反射 水面_UnityShader-菲涅尔反射(Fresnel Reflection)

    菲涅耳公式(或菲涅耳方程),由奥古斯丁·让·菲涅耳导出.用来描述光在不同折射率的介质之间的行为.由公式推导出的光的反射称之为"菲涅尔反射".菲涅尔公式是光学中的重要公式,用它能解释 ...

  5. unity shader 菲涅尔效果

    老样子,还是先上效果图: 菲涅尔效果的原理大家可以自己去百度看看,网上有很多,这里就不多说了,我们直接看如何实现这个效果 实现思路: 1.求得视角方向,法线方向(世界空间下) 2.根据菲涅尔效果的公式 ...

  6. Physics CG:菲涅尔(fresnel)反射

    这一篇是物理学CG的开篇,其实我多开了一个分类也是心理无奈的,自身水平有限,而很多物理图形学知识积累太少,有些甚至根本没学过.然而高级图形学知识中,或者说高级图形着色效果中,很大一部分是基于" ...

  7. Shader学习21——基于菲涅尔透明的扫描线

    看到人家这样的一个效果,于是想自己也复制一个 Mar-26-2021 17-16-26.gif 想了一下思路,应该是菲涅尔的做的一个透明效果(单纯的菲涅尔透明可以看这篇),再去做了一个线的效果,线应该 ...

  8. Chango的数学Shader世界(七)水波模拟-透明水面,菲涅尔(Fresnel)效应

    目的: 解析,改进,批评一个国外免费透明水面Shader,进一步了解Shader背后的物理原理. 参考: 菲涅尔反射 分析: 我将原水面Shader一再简化,从中抽取最主要的部分,忽略细枝末节,并改掉 ...

  9. Unity Shader知识点(三)高光反射Shader

    前言 此文及专栏系是以Shader入门精要为基础整理的Unity Shader学习笔记,尽量以初学者视角还原(其实半年前我就是初学者),错误还需指正. 本篇是实操部分的第三个Shader,即高光反射S ...

最新文章

  1. 本地Windows远程桌面连接阿里云Ubuntu服务器
  2. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装
  3. Log Buffer
  4. Matlab中巧用LaTex
  5. vim 与系统剪切板
  6. 聚类 —— DBSCAN
  7. HDU 4281 Judges' response [MTSP]
  8. Gradle中的buildScript,gradle wrapper,dependencies等一些基础知识
  9. 为什么总是有人说Java啰嗦,却没人说C++啰嗦?
  10. underscore 系列之内部函数 restArgs
  11. c语言从入门到精通 PPT,C语言从入门到精通第1章讲述.ppt
  12. Android中GPUImage的简单使用
  13. 实验一:数据结构之顺序表例程 简易电话薄
  14. wordcount程序中,输出文件夹中为空
  15. CF1720A Burenka Plays with Fractions 题解
  16. 涉及数字的英语表示——几点钟、年月日、世纪、年代、年龄
  17. AE中文破解版软件屏蔽_破解教程
  18. 2023电工杯数学建模思路 - 复盘:校园消费行为分析
  19. GitHub上README.md排版样式教程
  20. Redis查看当前密码

热门文章

  1. [Jzoj] 3055.比赛
  2. 数字形态学滤波matlab,数字形态学滤波器与智能车路径记忆
  3. 网站后台主流架构设计参考(图文)
  4. VScode 插件中 package.json 文件字段详解
  5. 2015移动安全挑战赛(阿里看雪主办)全程回顾
  6. LaTeX 页眉页脚的设置
  7. 储存器RAM、Flash、ROM、HHD简明对比
  8. 云原生监控报警可视化
  9. Linux删除除了某个文件之外的其他所有文件
  10. oracle非分区表,转分区表