效果如图(移动端截图):

水波效果也可以使用噪声纹理来实现,通过作为高度图并不段改变法线方向。我们会使用时间变量来对噪声纹理进行采样,再进行反射+折射计算。

我们使用一张立方体为环境纹理,并在列线空间下对像素坐标进行偏移,再使用该坐标进行屏幕采样,从而模拟折射效果。

水波是由一张噪声纹理生成的,随着时间不断变化,再用菲涅耳系数进行混合。
菲涅耳系数:
fresnel=pow(1-max(0,v.n),4)
v是视角方向,n是法线方向,夹角越小说明面越面向镜头,也就越亮。

先成立方体纹理,具体操作如下:
传送门:https://blog.csdn.net/ww1351646544/article/details/88389655
再准备一张水波图片水波纹理的法线贴图

解释在代码中:

Shader "Unity Shaders Book/Chapter 15/Water Wave" {Properties {//水面颜色_Color ("Main Color", Color) = (0, 0.15, 0.115, 1)//水面波纹_MainTex ("Base (RGB)", 2D) = "white" {}//水波法线_WaveMap ("Wave Map", 2D) = "bump" {}//立方体纹理_Cubemap ("Environment Cubemap", Cube) = "_Skybox" {}//水波X偏移速度_WaveXSpeed ("Wave Horizontal Speed", Range(-0.1, 0.1)) = 0.01//水波Y偏移速度_WaveYSpeed ("Wave Vertical Speed", Range(-0.1, 0.1)) = 0.01//方向_Distortion ("Distortion", Range(0, 100)) = 10}SubShader {Tags { "Queue"="Transparent" "RenderType"="Opaque" }//抓取屏幕纹理并存在_RefractionTex中GrabPass { "_RefractionTex" }Pass {Tags { "LightMode"="ForwardBase" }CGPROGRAM#include "UnityCG.cginc"#include "Lighting.cginc"#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment fragfixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;sampler2D _WaveMap;float4 _WaveMap_ST;samplerCUBE _Cubemap;fixed _WaveXSpeed;fixed _WaveYSpeed;float _Distortion;  sampler2D _RefractionTex;float4 _RefractionTex_TexelSize;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT; float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float4 scrPos : TEXCOORD0;float4 uv : TEXCOORD1;float4 TtoW0 : TEXCOORD2;  float4 TtoW1 : TEXCOORD3;  float4 TtoW2 : TEXCOORD4; };v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.scrPos = ComputeGrabScreenPos(o.pos);//按坐标为纹理采样位置和缩放o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);o.uv.zw = TRANSFORM_TEX(v.texcoord, _WaveMap);float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;  fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);  fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w; //列排三个向量的元素形成世界空间的转换矩阵o.TtoW0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);  o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);  o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);  return o;}fixed4 frag(v2f i) : SV_Target {//世界坐标位置float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);//顶点位置转视角空间fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));//速度:xy分量与时间相乘以达到随时间移动的效果float2 speed = _Time.y * float2(_WaveXSpeed, _WaveYSpeed);//取切线空间中的法线(图片RenderType要改为Normal)//取法线纹理并与速度偏移相加fixed3 bump1 = UnpackNormal(tex2D(_WaveMap, i.uv.zw + speed)).rgb;fixed3 bump2 = UnpackNormal(tex2D(_WaveMap, i.uv.zw - speed)).rgb;fixed3 bump = normalize(bump1 + bump2);//偏移乘以偏移的方向得到最后的偏移量float2 offset = bump.xy * _Distortion * _RefractionTex_TexelSize.xy;//修改屏幕采样坐标i.scrPos.xy = offset * i.scrPos.z + i.scrPos.xy;//用偏移的坐标对屏幕进行采样fixed3 refrCol = tex2D( _RefractionTex, i.scrPos.xy/i.scrPos.w).rgb;//偏移量转到世界空间bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));//主图加速度制作偏移效果fixed4 texColor = tex2D(_MainTex, i.uv.xy + speed);//光线反射fixed3 reflDir = reflect(-viewDir, bump);//反射颜射fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb * texColor.rgb * _Color.rgb;//菲涅尔系数fixed fresnel = pow(1 - saturate(dot(viewDir, bump)), 4);fixed3 finalColor = reflCol * fresnel + refrCol * (1 - fresnel);return fixed4(finalColor, 1);}ENDCG}}// Do not cast shadowFallBack Off
}

Shader学习的基础知识( 三十一)水波效果相关推荐

  1. Shader学习的基础知识( 三十)消融效果

    消融效果其实就是噪声纹理+透明度测试,取样阈值在小于0则裁剪掉,0到N显示中间色,N到1则正常显示. Shader "Unity Shaders Book/Chapter 15/Dissol ...

  2. 三 计算机知识的重要性分析,学习计算机基础知识对中专学生的重要性分析

    学习计算机基础知识对中专学生的重要性分析 [摘 要]本文主要介绍了计算机基础知识的内容,阐述了学习计算机基础知识对中专学生的作用,并且通过对计算机基础操作的学习,提高中专学生的计算机应用水平.希望本文 ...

  3. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  4. 关于图计算图学习的基础知识概览:前置知识点学习(PGL)[系列一]

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 0.1图计算基本概念 首先看到百度百科定义: 图计算(Graph Processin ...

  5. 快速学习mysql_快速学习MySQL基础知识

    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选 ...

  6. 谈计算机知识对学生的作用,浅谈学习计算机基础知识对中专学生的重要性

    [摘 要]本文主要介绍了计算机基础知识的内容,阐述了学习计算机基础知识对中专学生的作用,并且通过对计算机基础操作的学习,提高中专学生的计算机应用水平.希望本文可以让中专学生认识到学习计算机基础知识的重 ...

  7. 《机器学习》理论——速读学习1 基础知识

    <机器学习>理论--速读学习1 基础知识 该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! Time: 2021-12-05 学习目标:我需要了解神经网络除了工程 ...

  8. A.关于图计算图学习的基础知识概览:前置知识点学习(Paddle Graph L)【一】

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

  9. Redis学习之基础知识普及

    Redis学习之基础知识普及 1. Redis安装(单机) 2.Redis基本数据结构 3.Redis常用命令 3.1.Redis 键(key) 3.2.Redis 字符串(String) 3.3.R ...

最新文章

  1. ADO.NET笔记——带参数的查询防止SQL注入攻击
  2. python基础语法合集-Python基础语法介绍
  3. JavaWeb监听器
  4. pytorch 矩阵相乘_编译PyTorch静态库
  5. 【Android】ClassLoader Tree
  6. 经典案例:2012年最佳25个响应式网站设计作品《下篇》
  7. MySQL进阶操作之视图
  8. Oracle中各个命中率的总结及调优笔记整理
  9. latex支持python吗_用MarkDown和Python编写LaTex
  10. 路由器刷固件——斐讯路由器FIR300M刷OpenWrt固件教程
  11. 提取小米主题内部的桌面锁屏壁纸图片步骤
  12. 高手对中科院考博英语的分享
  13. Kettle下载与安装教程【保姆版】
  14. 软件构造第一次实验感想总结
  15. 基于Bootstrap的响应式网页
  16. C. Inna and Dima
  17. python显示gif图片_利用Python制作GIF图片
  18. Linux环境使用授权码实现软件授权
  19. 运动竞技类图文展示片头fcpx插件
  20. Mac上备份iphone照片

热门文章

  1. Diffusion Model原理详解及源码解析
  2. 坐下来谈谈如何写好一份简历?
  3. C#正则匹配(提取字符串中的数字)及C#“四舍五入”
  4. 普通人“微创业”实例
  5. 一个酒鬼有20美元,三美元可以买一瓶酒,三个空瓶子可以换一瓶酒
  6. jQuery中的DOM操作
  7. 用 iPhone 一键重启、关闭电脑
  8. 北京理工大学 计算机学院男女比例,39所985高校男女比例排名,看看哪些学校比例严重失调!...
  9. 史上最强人工智能ChatGPT 到底有多强?
  10. java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试