Unity Shader如何实现雨天的水面涟漪效果
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章给大家分享的是有关Unity Shader如何实现雨天的水面涟漪效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。上个动态效果......项目需求,需要加一个雨天的
千家信息网最后更新 2025年02月06日Unity Shader如何实现雨天的水面涟漪效果
这篇文章给大家分享的是有关Unity Shader如何实现雨天的水面涟漪效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
上个动态效果......
项目需求,需要加一个雨天的水面涟漪效果,一开始的想法是直接加特效,但过过脑子就知道有多费,不现实,最好的方法还是要用shader来实现,但是如何实现纹理的随机扩散(雨滴有大有小),和不规则的时间(雨滴有先有后),想了很久都没想明白,好在从AssetStore里发现了类似的效果,一顿研究以后,发现其实挺简单的......拿出来跟大家分享。
刚才我说的两个问题,随机扩散和不规则时间,这位大神用贴图来解决了(一开始我们想过,但是没有想到实现方法),接下来展示一下这张图。
这样看起来有点莫名其妙对吧,我们把四个通道来分开看,就清楚多了。
我来分别解释一下,R通道代表了涟漪生成的范围,并且带有淡出的效果,GB两个通道是高度,差不多就是法线图的效果,A通道用来存储时间差,从白到黑不同的颜色值代表了不同的时间。
接下来相信很多人就已经明白怎么写了,这里我贴出了代码,重要的地方都加了点自己的理解,没有多少行,还是比较简单的。
Shader "Custom/Ripple" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
_RippleTex("RippleTex", 2D) = "white" {}
_RippleScale("RippleScale",Range(1,10)) =1
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
#define PI 3.141592653
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
half2 texcoord;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
sampler2D _RippleTex;
float _RippleScale;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
//计算波纹的主函数
float3 ComputeRipple(float2 uv, float t)
{
//波纹贴图采样,并把采样的高度值扩展到-1到1。
float4 ripple = tex2D(_RippleTex, uv);
ripple.yz = ripple.yz * 2.0 - 1.0;
//获取波纹的时间,从A通道获取不同的波纹时间,
float dropFrac = frac(ripple.a + t);
//把时间限制在R通道内
float timeFrac = dropFrac - 1.0 + ripple.x;
//做淡出处理
float dropFactor = 1-saturate( dropFrac);
//计算最终的高度,用一个sin计算出随时间的振幅,修改一下值就知道什么效果了
float final = dropFactor* sin(clamp(timeFrac * 9.0, 0.0, 4.0) * PI);
return float3(ripple.yz * final, 1.0);
}
void surf (Input IN, inout SurfaceOutputStandard o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
//调用方法,获取高度。这里我懒得用一个新uv,索性直接用的主贴图UV
float3 ripple = ComputeRipple(IN.uv_MainTex / _RippleScale, _Time.y);
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
//赋值到法线上
o.Normal = ripple;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
感谢各位的阅读!关于"Unity Shader如何实现雨天的水面涟漪效果"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
效果
时间
通道
涟漪
波纹
高度
水面
雨天
不同
方法
贴图
不规则
接下来
两个
代表
内容
更多
法线
篇文章
还是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
怎样申请服务器
全国小学生网络安全日主题
软件开发 人工成本 验证
我的csgo服务器别人连不进去
怎么保护数据库的安全
软件开发需要具备的优点
网络安全创新提纲
网络安全开放视频
服务器管理怎么设置
机架式服务器安装专业人员
阿里云服务器空间还能用吗
南邮IP网络技术基础实验报告
怎么弄国外的服务器
少年的你网络安全吗
视障导航软件开发力度
迷你塔式服务器
网络安全法治宣传开展情况
网络安全专业2本学院
流星蝴蝶剑服务器文件下载失败
2021年网络安全宣传周在哪里
专门学网络安全的专业
网络安全主题创意手工
服务器snmp弱口令怎么整改
汕尾数据链软件开发维修电话
越南数据库教学
服务器最强cpu配置
网络安全技术SA
信息化网络安全应急演练
软件开发常见问题处理手册
数据库安全机制的5个层级