Unity UV 水效果实现

2023-11-05

Unity Water Shader

Shader "Custom/SeaWave"
{
	Properties{
		_WaterTex("水纹理", 2D) = "black" {}
		_WaveTex("海浪", 2D) = "black" {} //海浪
		_BumpTex("碰撞纹理", 2D) = "bump" {}
		_GTex("海水渐变", 2D) = "white" {} //海水渐变
		_NoiseTex("海浪躁波", 2D) = "white" {} //海浪躁波
		_WaterSpeed("海水速度", float) = 0.74  //海水速度
		_WaveSpeed("海浪速度", float) = -12.64 //海浪速度
		_WaveRange(" 波动范围", float) = 0.3
		_NoiseRange("噪声幅度", float) = 6.43
		_WaveDelta("深水波动", float) = 2.43
		_Refract("折射", float) = 0.03
		_Specular("反射", float) = 1.86
		_Gloss("遮盖", float) = 0.71
		_SpecColor("标准颜色", color) = (1, 1, 1, 1)
		_Range("范围", vector) = (0.13, 1.53, 0.37, 0.78)
	}
		CGINCLUDE
			fixed4 LightingWaterLight(SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten) {
			half3 halfVector = normalize(lightDir + viewDir);
			float diffFactor = max(0, dot(lightDir, s.Normal)) * 0.8 + 0.2;
			float nh = max(0, dot(halfVector, s.Normal));
			float spec = pow(nh, s.Specular * 128.0) * s.Gloss;
			fixed4 c;
			c.rgb = (s.Albedo * _LightColor0.rgb * diffFactor + _SpecColor.rgb * spec * _LightColor0.rgb) * (atten);
			c.a = s.Alpha + spec * _SpecColor.a;
			return c;
		}
		ENDCG
			SubShader{
				Tags { "RenderType" = "Transparent" "Queue" = "Transparent"}
				LOD 200

				GrabPass{}
				zwrite off

				CGPROGRAM
				#pragma surface surf WaterLight vertex:vert alpha noshadow
				#pragma target 3.0

				sampler2D _GTex;

				sampler2D _WaterTex;
				sampler2D _BumpTex;
				sampler2D _CameraDepthTexture;
				sampler2D _GrabTexture;
				half4 _GrabTexture_TexelSize;

				sampler2D _NoiseTex;
				sampler2D _WaveTex;

				float4 _Range;

				half _WaterSpeed;

				half _WaveSpeed;
				fixed _WaveDelta;
				half _WaveRange;
				fixed _Refract;
				half _Specular;
				fixed _Gloss;

				half _NoiseRange;

				float4 _WaterTex_TexelSize;

				struct Input {
					float2 uv_WaterTex;
					float2 uv_NoiseTex;
					float4 proj;
					float3 viewDir;
				};

				void vert(inout appdata_full v, out Input i) {
					UNITY_INITIALIZE_OUTPUT(Input, i);

					i.proj = ComputeScreenPos(UnityObjectToClipPos(v.vertex));
					COMPUTE_EYEDEPTH(i.proj.z);
				}

				void surf(Input IN, inout SurfaceOutput o) {
					float2 uv = IN.proj.xy / IN.proj.w;
					#if UNITY_UV_STARTS_AT_TOP
					if (_WaterTex_TexelSize.y < 0)
					uv.y = 1 - uv.y;
					#endif
					fixed4 water = (tex2D(_WaterTex, IN.uv_WaterTex + float2(_WaterSpeed*_Time.x,0)) + tex2D(_WaterTex, float2(1 - IN.uv_WaterTex.y,IN.uv_WaterTex.x) + float2(_WaterSpeed*_Time.x,0))) / 2;
					float4 offsetColor = (tex2D(_BumpTex, IN.uv_WaterTex + float2(_WaterSpeed*_Time.x,0)) + tex2D(_BumpTex, float2(1 - IN.uv_WaterTex.y,IN.uv_WaterTex.x) + float2(_WaterSpeed*_Time.x,0))) / 2;
					half2 offset = UnpackNormal(offsetColor).xy * _Refract;
					half m_depth = LinearEyeDepth(tex2Dproj(_CameraDepthTexture, IN.proj).r);
					half deltaDepth = m_depth - IN.proj.z;

					fixed4 noiseColor = tex2D(_NoiseTex, IN.uv_NoiseTex);

					half4 bott = tex2D(_GrabTexture, uv + offset);
					fixed4 waterColor = tex2D(_GTex, float2(min(_Range.y, deltaDepth) / _Range.y,1));

					fixed4 waveColor = tex2D(_WaveTex, float2(1 - min(_Range.z, deltaDepth) / _Range.z + _WaveRange * sin(_Time.x*_WaveSpeed + noiseColor.r*_NoiseRange),1) + offset);
					waveColor.rgb *= (1 - (sin(_Time.x*_WaveSpeed + noiseColor.r*_NoiseRange) + 1) / 2)*noiseColor.r;
					fixed4 waveColor2 = tex2D(_WaveTex, float2(1 - min(_Range.z, deltaDepth) / _Range.z + _WaveRange * sin(_Time.x*_WaveSpeed + _WaveDelta + noiseColor.r*_NoiseRange),1) + offset);
					waveColor2.rgb *= (1 - (sin(_Time.x*_WaveSpeed + _WaveDelta + noiseColor.r*_NoiseRange) + 1) / 2)*noiseColor.r;

					half water_A = 1 - min(_Range.z, deltaDepth) / _Range.z;
					half water_B = min(_Range.w, deltaDepth) / _Range.w;
					float4 bumpColor = (tex2D(_BumpTex, IN.uv_WaterTex + offset + float2(_WaterSpeed*_Time.x,0)) + tex2D(_BumpTex, float2(1 - IN.uv_WaterTex.y,IN.uv_WaterTex.x) + offset + float2(_WaterSpeed*_Time.x,0))) / 2;

					o.Normal = UnpackNormal(bumpColor).xyz;

					o.Specular = _Specular;
					o.Gloss = _Gloss;
					o.Albedo = bott.rgb * (1 - water_B) + waterColor.rgb * water_B;
					o.Albedo = o.Albedo * (1 - water.a*water_A) + water.rgb * water.a*water_A;
					o.Albedo += (waveColor.rgb + waveColor2.rgb) * water_A;

					o.Alpha = min(_Range.x, deltaDepth) / _Range.x;
				}
				ENDCG
		}
			//FallBack "Diffuse"
}

组件搭载

在当前 Shader 上创建一个 Material 材质球

请添加图片描述

新建一个 Plane 并把 刚才新建的 材质球 赋予

请添加图片描述

基本参数调节

请添加图片描述

所需图片

↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ 图片 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓

请添加图片描述

↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑ 图片 ↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ 图片 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓

请添加图片描述

↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑ 图片 ↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑

请添加图片描述

请添加图片描述

↡↡↡↡↡↡↡↡↡↡ ↡↡↡↡↡↡↡↡↡↡ 下面有一张图片 ↡↡↡↡↡↡↡↡↡↡ ↡↡↡↡↡↡↡↡↡↡

请添加图片描述

↟↟↟↟↟↟↟↟↟↟ ↟↟↟↟↟↟↟↟↟↟ 上面有一张图片 ↟↟↟↟↟↟↟↟↟↟ ↟↟↟↟↟↟↟↟↟↟

请添加图片描述

效果呈现

不同角度 展示不同效果

请添加图片描述

请添加图片描述
暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity UV 水效果实现 的相关文章

  • 在 Threejs 平面上渲染 TMX 地图

    使用新代码更新了问题 我正在尝试编写一个 WebGL 着色器来绘制TMX层 https github com bjorn tiled wiki TMX Map Format 从 Tiled 编辑器导出 我正在使用 THREE js 创建一个
  • Threejs DataTexture 未更新

    更新 问题是每次都会重新创建 texData 对象 因此 DataTexture 的引用丢失 WestLangley 的解决方案是覆盖 texData 中的数据 而不是重新创建 texData 对象 我有一个简单的 Threejs 场景Da
  • Android 中图像的填充图案

    下面给出了两个图像 我将第一个图像称为帧图像 将第二个图像称为帧图像 这里 fst 是我的线性布局 我将帧图像设置为它的背景图像 现在我想在帧图像的白色区域中填充图案图像 帧图像的外部区域是透明的 内部区域是白色的 我如何在我的框架图像中填
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 为 webgl 中的每个对象使用不同的顶点和片段着色器

    我在 webgl 中有一个包含多个对象的场景 对于每个对象 我想使用不同的顶点和片段着色器 我的第一个问题是 是否可以为每个对象都有一个着色器 我知道在 opengl 中这是可能的 这是与我的想法类似的伪代码 任何例子将不胜感激 glena
  • 用于几何入口点的 SceneKit 着色器修改器适用于 iOS,但不适用于 OS X

    我正处于制作 SceneKit 着色器修改器 用于几何入口点 的早期阶段 该修改器根据高度图纹理置换平面的几何形状 计划是用它来创建地形 在 iOS 编辑 iOS 模拟器 中 着色器按其应有的方式工作 但会将此警告打印到控制台 SceneK
  • LibGDX 网格高度图法线和灯光

    我正在尝试让网格法线和灯光在 LibGDX 项目中工作 我已经有了从高度图纹理像素生成的纹理网格 问题是我无法正确点亮法线 另外 我不能 100 确定我在 TerrainChunk 类中正确设置了法线顶点 这是主类代码 package co
  • 我们可以在透明窗口上应用着色器吗

    I am looking to apply a particular shader to a transparent window for example on a live desktop I want to create a trans
  • 如何在 Unity 中创建一个可以显示由许多小图像组成的纹理的着色器

    所以我想做的是从 SQL 表加载卫星图像并将它们包裹在一个球体周围以创建一个地球仪 我知道我已经加载了所涵盖的图像 我只是不确定如何使我的着色器以正确的方向显示图像 我去了 Unity 论坛并查看了这段代码 https docs unity
  • Unity3D - 用于精灵裁剪的着色器

    我正在尝试创建一个可用于在游戏中剪辑 2D 精灵的着色器 我在中找到了该着色器另一个问题 https stackoverflow com questions 16397023 unity3d a shader that will clip
  • 线性光模式的 Alpha 混合层

    我正在重新创建一些 Photoshop 混合 并尝试使用线性光模式 在 Photoshop 中 您将有一个不透明度为 100 的背景图层 然后是一个不透明度为 50 的顶层 其混合模式设置为 线性光 我确实找到了有关如何进行线性光混合的信息
  • OpenGL 统一缓冲区 std140 布局

    我正在尝试通过 GeForce 8600 GT 上的统一块将整数数组传递给片段着色器 一切均根据 GLSL version 330 在应用程序方面我有 int MyArray 7102 filling binding etc glBuffe
  • glUseProgram(0) 的作用是什么?

    OpenGL 文档为glUseProgram https www khronos org registry OpenGL Refpages gl4 html glUseProgram xhtml声称用参数调用它zero将导致着色器执行的结果
  • LibGDX - 着色器适用于桌面但不适用于 Android

    我编写了一个简单的程序 可以在 3D 环境中渲染球体 并根据球体周围的四个光源为其着色 当我在桌面上运行该程序时 它工作得很好 但在 Android 设备上 球体只是纯色的 下面是一些图片来说明我正在谈论的内容 gt Desktop gt
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 帧缓冲区和在 opengl 中使用着色器

    我对帧缓冲区有点困惑 我想要做的是使用附加了多个纹理的帧缓冲区 填充每个纹理 然后使用着色器组合 混合 所有纹理以创建新的输出 听起来很容易 是的 我也是这么想的 但我不明白 如何将当前绑定的纹理传递给着色器 您需要的是将纹理放入特定的槽中
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其

随机推荐

  • 【Docker】Docker使用之容器技术发展史

    博客主页 博主链接 本文由 M malloc 原创 首发于 CSDN 学习专栏推荐 LeetCode刷题集 欢迎点赞 收藏 留言 如有错误敬请指正 未来很长 值得我们全力奔赴更美好的生活 文章目录 本章详情 Jail时代 1979 年 贝尔
  • 华为OD机试题:消除相邻且相同

    题目描述 输入一个只包含英文字母的字符串 字符串中的俩个字母如果相邻且相同 就可以消除 在字符串上反复执行消除的动作 直到无法继续消除为止 此时游戏结束 输出最终得到的字符串长度 输入描述 原始字符串只能包含大小写英文字母 字母的大小写敏感
  • 禁止系统运行某个进程的简单方法(注册表操作)

    一 解决方法 修改注册表 HKLM SOFTWARE Microsoft Windows NT CurrentVersion Image File Execution Options 下建立一个以要禁用的程序名命名的子项 如 hudan e
  • python爬虫修饰_python爬虫URL重试机制的实现方法(python2.7以及python3.5)

    应用场景 状态不是200的URL重试多次 代码比较简单还有部分注释 python2 7实现 coding utf 8 ayou import requests def url retry url num retries 3 print ac
  • 生活中那些六 “有” 的人

    1 有承诺 一些事情开始的时候总会有些协议与约定 我们称其为承诺 我们必须遵守承诺 即使是约会也要遵守 也不能迟到 迟到这件事不但会妨碍我们所有人 还意味着迟到者不尊重大家的时间 这种约定从某种意义上来讲也是承诺 如果你来晚了 这就表示你的
  • 蓝桥杯考生规则

    2017年模拟赛 本科组 考生须知 l 考试开始后 选手首先下载题目 并使用考场现场公布的解压密码解压试题 l 考试时间为4小时 时间截止后 提交答案无效 l 在考试强制结束前 选手可以主动结束考试 需要身份验证 结束考试后将无法继续提交或
  • java计算机毕业设计火车订票系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计火车订票系统源码 mysql数据库 系统 lw文档 部署 java计算机毕业设计火车订票系统源码 mysql数据库 系统 lw文档 部署 本源码技术栈 项目架构 B S架构 开发语言 Java语言 开发软件 idea
  • Tomcat调优

    问题定位 对于Tomcat的处理耗时较长的问题主要有当时的并发量 session数 内存及内存的回收等几个方面造成的 出现问题之后就要进行分析了 1 关于Tomcat的session数目 这个可以直接从Tomcat的web管理界面去查看即可
  • Go语言学习13-类型转换

    类型转换 引言 类型转换 1 概念 2 数值类型之间的转换 3 与string类型相关的转换 4 别名类型值之间的转换 结语 引言 在上一篇博文中 我们介绍了 Go 语言的 数据的使用 本篇博文 我们将介绍 Go 语言的类型转换 类型转换
  • HTTP头的Expires与Cache-control

    1 概念 Cache control用于控制HTTP缓存 在HTTP 1 0中可能部分没实现 仅仅实现了Pragma no cache 数据包中的格式 Cache Control cache directive cache directiv
  • 程序员的十个等级

    转载自 http blog csdn net fx0000001 article details 50397265 如果你还迷茫请看这里 如果你很牛逼请看这里 如果你很自傲请看这里 总有你想学会的 自西方文艺复兴以来 中国在自然科学方面落后
  • 不带头结点的单链表

    建立结构体 和带头结点但单链表一样 按需建立即可 我以建立一个储存学生信息的链表举例 typedef struct node char name 20 int number struct node next Node LinkList 单链
  • 探索全桥电机驱动模块:实现精确控制与高效驱动

    全桥电机驱动模块是一种在现代工程应用中广泛使用的电机驱动方式 对于需要精确控制和高效驱动的场景 如机器人 无人机 电动车等 全桥电机驱动模块提供了理想的解决方案 本文将介绍全桥电机驱动模块的原理和实际应用场景 并对几种常见的全桥驱动芯片进行
  • csdn的Markdown行首缩进的两种方法,非常全

    csdn的行首缩进 鉴于不同编辑器的Markdown语法略微不同 故缩进也略不同 1 特殊占位符 不缩进 行首缩进 nbsp 行首缩进 160 四分之一中文占位符 行首缩进 8197 四分之一中文占位符 行首缩进 ensp 行首缩进 819
  • Spring中Bean的生命周期

    Spring Bean的生命周期是从Bean 实例化之后 即通过反射创建出对象之后 到Bean成为一个完整对象 最终存储到单例池中 这个过程被称为Spring Bean的生命周期 Spring Bean的生命周期大体上分为四个阶段 实例化
  • vue2.0项目调用多个IP接口

    项目中经常遇到跨域问题 最简单的方式就在本地配置代理 可偶尔遇到一个页面里面需要调用来自两个以上不同IP段的接口 多个IP要怎么配置代理呢 请往下看 在项目目录 config index js文件配置代理 module exports de
  • pytest

    一 pytest是单元测试框架 单元测试 对软件开发中 对软件的最小单位 函数 方法 进行正确性检查测试 java框架 jnuit和testing python框架 unittest和pytest 流程 i 测试发现 从多个文件中找到测试用
  • 英俊飘逸气宇轩昂——同人立绘征集大赛凤九天·金奖

    导语 本期介绍的作品是由来自江西科技师范大学的计世平设计的凤九天形象 荣获了本次大赛凤九天组别的金奖 2020年12月22日 由首都版权协会联合全国部分高等院校和链游玩家及部分企业共同举办的 2020同人立绘征集大赛 正式启动 并于2021
  • 详解pop()和push()方法

    pop 是移除堆栈顶部的元素并且返回它的值 push 是把对象压入堆栈的顶部 这里的堆栈不是特指栈 是LinkedList中特有的方法 LinkedHashset和LinkedHashMap ArrayList中没有此方法 下面是个小李子
  • Unity UV 水效果实现

    Unity UV 水效果实现 Unity Water Shader 组件搭载 基本参数调节 所需图片 效果呈现 Unity Water Shader Shader Custom SeaWave Properties WaterTex 水纹理