UE4_材质_雨滴涟漪效果ripple effect_ben教程

news2025/1/22 9:09:52

学习笔记,不喜勿喷!侵权立删,祝愿生活越来越好!

雨水落下时会产生这些非常漂亮的同心环波纹,我们要做的第一件事是创建一个单个的圆环遮罩动画,我们希望环在开始的时候在中心很小,然后放大,然后淡出。

1、创建径向渐变纹理。

我们要从一个简单的径向渐变纹理开始,如下图:

 可以在ps中创建此效果,很简单。

2、动画效果制作

但是我想做的是动画效果,添加时间节点,因为时间是一切动画的基础。

因为我需要的是时间的一部分,所以我添加frac节点,节点frac的作用是无论它输入的是什么样的整数值。都会将其删除,只会保留小数部分。所以我将time节点连接到frac节点。我会得到一个介于0和1之间的重复的数值,从0到1,从0到1,波纹正是这样的。

接下来要做的是要减去1,我要创建一个常数节点,这样我们会得到一个从-1到0变化的值,然后再创建一个add节点,我要把渐变纹理加到里面去,这样我们会得到纹理从小到大并且向外逐渐扩张的效果。

这就是动画波纹效果的开始。从小逐渐变大再到无再从小变大。

3、多圈涟漪效果制作

接下来要做的是稍微增加对比度。我要乘以一个很大的值。它用于控制我的波纹的边缘的尖锐程度:当为20的时候,也就是原来的径向渐变是最大的时候,这个值乘以20,也就是原来0.05的位置的值变成了1.渐变过渡变得非常窄了。效果如下:

我还需要把它限制在0到5之间,目的是为了后面产生5圈涟漪的目的。

现在,如果我想创建波纹效果,我真正需要使用的是正弦波。正弦会产生好多0到1的渐变。

大家再来回顾下sine的曲线图:

正弦周期内有一半的值是低于0的,即为黑色。它与数学中的正弦函数是有区别的,我们为了让它与数学中的正弦函数相一致,可以修改它的周期为2π(6.283185)。

现在只有一个涟漪,如果我们想得到多个涟漪,我们可以乘以π。

这样又得到了多个涟漪效果。

接下来要做的就是弄清楚如何当它们到达尽头时,这些波纹立即在边缘消失。我应该怎么做呢?

4、越靠近边缘越暗的遮罩制作

我可以利用我的时间值,以便随着时间的变大,我要做的就是oneminus,当它接近1时,该值会降低。也就是原来的从0到1变为了从1到0。也就意味着越靠近边缘越暗。我们让涟漪的结果乘以这个变化就行。

我们就得到了这样一个越靠近边缘越暗的漂亮的遮罩。圆环越靠近边缘,它们也会逐渐消失。

5、使用自制的法线和遮罩组合而成的纹理

我们现在需要做的是,我们有一个非常漂亮的遮罩用于圆环,圆环遮罩转换成一些法线,为了做到这一点,我要改变这里的纹理,而不是雨滴渐变,我将选择这个raindrop雨滴的纹理,让我们看一下该纹理的外观。

各个通道如下:

红色通道是径向渐变如下

绿色通道如下

蓝色通道如下:

可以看出在绿色和蓝色通道是一个圆锥的法线贴图的x和y,我需要在蓝色通道中获取绿色,绿色通道中获取我的红色,我使用append节点,

然后我要乘以2减去1,因为法线向量范围是从-1到1的,而不是0到1,现在我有了法线数据的前两部分,要想让它变成normal,我需要在附加1这个值来作为法线的Z轴上的分量,数学上来说是不对的,但这样速度快。

连接到材质的normal引脚,来看看效果:

法线具有了小水滴的效果了。

但是我想做的事是根据我的遮罩为法线设置动画。在附加1之前,我需要把x和y的值乘以遮罩。

运行想过如下:

非常好的波纹形状,正是我想要的。

6、制作多个涟漪的纹理贴图

接下来我想做的不是一个涟漪,而是一堆涟漪,那样我就需要复制好多个,调调不同的大小。如下图:

但这儿还有个问题,我们需要不同的涟漪出现的时间不同,而不是像下面这样同时出现。

我们需要使用时间偏移图:

使用不同的颜色来表示开始的时间,正好放在纹理贴图的alpha通道中存储,

我们只要把时间偏移图加到time中去即可:

这时再来看效果:

这样我们就得到了不同时间发生的涟漪。

法线的基础知识可以参照这篇文章:

3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇

https://www.cnblogs.com/wangchengfeng/p/3470310.html

人眼对物体的凹凸感觉,很大程度上取决于表面的光照明暗变化,如果能通过一张贴图在一个平面上表现出由凹凸造成的明暗变化,则可以让人眼感觉这个平面是凹凸不平的(虽然这个平面还是平的)。法线贴图正是为了这个目的而产生的。

准确的说,法线贴图是Bump Mapping(凹凸贴图)的其中一种。第一个Bump Mapping由Blinn在1978年提出,目的是以低代价给予计算机几何体以更丰富的表面信息。30年来,这项技术不断延展,尤其是计算机图形学成熟以后,相继出现了不少算法变体,法线贴图就是其中很重要的一种。研究人员对法线贴图进一步改进,出现了Parallax Mapping(视差贴图), Relief Mapping等技术,实现了更逼真的效果。本文仅针对法线贴图进行介绍。

一条法线是一个三维向量,一个三维向量由x, y, z等3个分量组成,在法线贴图中,把(x, y, z)当作RGB3个颜色的值存储(如图2),并将其每个分量映射到[-1, 1]。例如,对于x, y, z各有8位的纹理,[0, 128, 255]表示法向量(-1, 0, 1)。

法线贴图中存储的法线最初是定义在世界空间中,但在实际中,这种方式很少见,因为只要物体移动,法线贴图则不再有效。另一种方式就是将法线存储在物体的局部空间中,物体可以进行刚体变换(平移,旋转,缩放),法线贴图依旧有效,但是这种方法并不能应对任何方式的变换,并且法线贴图不能在不同物体进行复用,增加了美工的负担。所以,现在现在普遍采用的解决方案是将法线存储在切线空间中。

简单的来说,切线空间可以理解为纹理空间的u,v方向和法向量n,这3个方向构成了切线空间,一般使用T、B和N表示,如图3所示。具体解释见【D3D11游戏编程】学习笔记二十四:切线空间(Tangent Space)_计算切空间 d3d-CSDN博客,这个博客解释的很好,没见过的童鞋可以看一看,第一次理解可能会有点困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

45岁TVB女星惊爆与大15岁老公离婚

45岁的姚嘉妮今日被传媒爆出与结婚18年老公林祖辉离婚,她接受其他传媒访问时,指两人分开不涉及第三者,而一对子女亦会共同抚养,而更令人惊讶的是,两人已经离婚多年,女方形容大家现在关系为家人。 不过9年前…

MBR40100CT-ASEMI无人机专用MBR40100CT

编辑:ll MBR40100CT-ASEMI无人机专用MBR40100CT 型号:MBR40100CT 品牌:ASEMI 封装:TO-220 最大平均正向电流(IF):40A 最大循环峰值反向电压(VRRM):100V…

深入Node.js:实现网易云音乐数据自动化抓取

随着互联网技术的飞速发展,数据已成为企业和个人获取信息、洞察市场趋势的重要资源。音频数据,尤其是来自流行音乐平台如网易云音乐的数据,因其丰富的用户交互和内容多样性,成为研究用户行为和市场动态的宝贵资料。本文将深入探讨…

maven安装、配置与plugins报红的解决方法

maven安装与配置 1.在官网中下载maven 官网地址:https://maven.apache.org/ 2.解压maven压缩包 将maven解压到一个没有中文的文件夹中: 3.配置环境变量并验证 1、在设置中找到 “高级系统设置”,点击后再点击环境变量: 2、在 “系…

Arcgis导入excel出现的问题

我手动添加了object-id字段也没有用,然后再excel里面又添加了一行,关闭后打开还是不行,额案后在网上看到了一种方法,很有效,予以记录。 1、我的文件是csv格式, 先在excel里面另存为xlsx格式 2、转换工具里…

【植物大战僵尸】C语言教程

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

云徙科技助力竹叶青实现用户精细化运营,拉动全渠道销售额增长

竹叶青茶以其别具一格的风味与深厚的历史底蕴,一直被誉为茶中瑰宝。历经千年的传承与创新,竹叶青不仅坚守着茶叶品质的极致追求,更在数字化的浪潮中,率先打破传统,以科技力量赋能品牌,成为茶行业的领军者。…

深度剖析ElasticSearch分页原理与深分页问题|ES深分页问题|ES分页原理剖析

文章目录 ES分页|Paginate search resultsES深分页的问题一页获取数据量太大,报错分页深度太大,报错官方解释 其他解决方案Search after解决两个问题 有没有深分页查询的必要性?search after & PIT的使用方式1.创建pit2.首次查询3.之后的…

33、循环语句--函数---递归+阶乘

一、函数 1.1、shell的函数 1.1.1、函数的定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {}do命令序列doneif []then 命令序列else命令序列fi #可以作为一个命令序列作用:方便重复使用,函数库&…

在 Go 中如何让结构体不可比较?

最近我在使用 Go 官方出品的结构化日志包 slog 时,看到 slog.Value 源码中有一个比较好玩的小 Tips,可以限制两个结构体之间的相等性比较,本文就来跟大家分享下。 在 Go 中结构体可以比较吗? 在 Go 中结构体可以比较吗&#xff…

Elasticsearch docker 安装及基本用法

创建网络 首先通过命令创建一个网络 docker network create es-net然后查看网络 [rootDocker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4e315f5e3ae7 bridge bridge local a501a9f3b4ee es-net bridge local ebca66b02e8c host …

十一、数据结构(图的最短路)

文章目录 基础部分最短路径问题用 D F S DFS DFS搜索所有的路径用 B F S BFS BFS求最短路径 最短路算法 F l o y d Floyd Floydcode(Floyd的实现): S P F A SPFA SPFAcode(基于邻接表的 S P F A ) SPFA) SPFA) D i j k s t r a Dijkstra Dijkstracode(dijkstra的实现…

PHP实现企业微信素材上传与获取的完整指南与踩坑日记

企业微信作为一款专门为企业打造的即时通讯工具,提供了丰富的功能和接口,其中包括素材管理。素材管理在企业内部的沟通、分享和展示中起着重要的作用。本篇文章将介绍如何使用PHP语言对接企业微信素材上传和获取的功能。 ## 1. 准备工作 首先&#xff0…

AI数据分析:Excel表格智能判断数据起点来计算增长率

工作任务:计算Excel表格中2023年1月到2024年4月的总增长率和复合增长率。 如果数据都有的情况下,公式很简单: 总增长率 (O2-B2)/B2 复合增长率 POWER((O2/B2),1/13)-1 但是,2023年1月、2月、3月的数据,有些有&…

LLM2Vec论文阅读笔记

这是篇LLM论文,用decoder-like的LLM去提取embedding文章认为,decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism,其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案

jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库,支持多种缓存方案和缓存策略,主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性,可以根据需求选择合适的缓存方案。 JetCache 的主…

VPC Access Connector 介绍 - 让 Non-VPC product 也可以访问VPC Network内的资源

什么是VPC product 和 非 VPC product 在GCP 上, VPC product 指的是属于某个制定的vpc subnet, 具有至少1个 该 subnet 的内网ip的产品 常见的例如: compute engine / MIG (managed instances group)某些dataflow job (指定了 可选参数subnet )Cloud …

C++设计模式——Composite组合模式

一,组合模式简介 真实世界中,像企业组织、文档、图形软件界面等案例,它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易,在软件开发中,组合模式的设计思想和它们类似。 组合模式是…

复分析——第4章——Fourier变换(E.M. Stein R. Shakarchi)

第4章 Fouier变换 Raymond Edward Alan Christopher Paley, Fellow of Trinity College, Cambridge, and International Research Fellow at the Massachusetts Institute of Technology and at Harvard University, was killed by an avalanche on April 7, 1933, whi…

Golang | Leetcode Golang题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; func fractionToDecimal(numerator, denominator int) string {if numerator%denominator 0 {return strconv.Itoa(numerator / denominator)}s : []byte{}if numerator < 0 ! (denominator < 0) {s append(s, -)}// 整数部分numer…