UE4_材质_水涟漪、水深制作_Ben教程

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

效果图如下:

创建水材质的教程,首先需要外出收集一些参考,看一看你将要做的事情很重要,确定将要模仿物体的关键属性,从这些拍摄的视频和图片可以看出,水表面具有一些惊人的表面波纹图案:

随着深度的增加,水会改变颜色,水越深越不透明。可以看到水在反射周围环境

反射的有趣之处在于,当您直视水下时,可以看到水底,当您横看水面时,反射更明亮,表面上的波浪和涟漪会创造一些有趣的扭曲图案,折射光线并使底部的物体扭曲。我们可以创建在急流中形成的泡沫。

任务主要分三块,第一先创建一些水表面涟漪,然后创建深度不透明和深度颜色,最后介绍反射和折射。

一、创建水表面涟漪(涟漪着色器)

1、网上搜索水法线贴图:

2、下载并导入:

3、创建水材质,导入法线贴图,并连接观察效果:

4、添加Panner节点

可以看到我们得到了水的涟漪,我们需要让它移动,添加panner节点,这个节点的作用是滚动纹理,所以只需将节点连接到法线的uv插槽,我们只需设置下参数即可:

但是你会发现这样太规则速度太快了,接下来我们来解决这2个问题。

5、利用WorldPosition节点 +ComponentMask节点来创建UV

我想利用世界位置进行投射uv而不是用uv进行投射,添加节点worldpositionWS,我需要的是X和Y轴方向,而不需要Z轴方向,因此需要添加componentmask节点,

效果如图:

6、添加Multiply节点控制uv大小

你会发现贴图太小了,所以我们还需要做的是通过multiply节点来控制uv的大小,乘以一个0.0035的常数:

效果如图:

Tips:

Panner(平移) 表达式输出可用于创建平移(或移动)纹理的 UV 纹理坐标

项目

说明

属性

速度 X(SpeedX)

指定在 U 方向上平移坐标的速度。

速度 Y(SpeedY)

指定在 V 方向上平移坐标的速度。

输入

坐标(Coordinate)

接收可以通过表达式来修改的基本 UV 纹理坐标。

时间(Time)

接收用来确定当前平移位置的值。这通常是用来提供常量平移效果的 Time(时间) 表达式,但是,也可以使用 Constant(常量) 或 ScalarParameter(标量参数) 来设置特定偏移,或者通过 Matinee 或蓝图来控制平移。

Panner(平移)会生成根据"时间"(Time)输入而变化的 UV。"坐标"(Coordinate)输入可用于处理 Panner(平移)节点所生成的 UV(例如,使其偏移)。

现在平移不动,我需要给它个speed,如下图:

但你会发现它非常缓慢。我们需要加大此值,设为17.5.你会发现它们是沿着对角线的方向进行移动。这是因为此值在U和V方向上是一样的,所以我想使用2个值分别控制。

7、制作不同滚动方向的涟漪效果(法线贴图)

我们接下来要做的是,复制这些节点,采样法线贴图多次,每次滚动不同方向,这样我可以在这些涟漪当中创建一些混乱,让它使用不同的滚动速度和缩放值,如下图:

它们在Y轴向上,滚动相反。

8、法线低开销混合(Append+Add+DeriveNormalZ)

法线混合中,有一种非常廉价的方式来混合此节点,对X和Y来进行混合:

再添加一个乘法节点来控制法线贴图的强度,添加一个DeriveNormalZ节点来求出法线,连接到法线引脚:

效果如下图:

现在是我们有了2个法线贴图,它们在不同的方向滚动,它们的比例和速度略有不同,它们最终得到了很酷的东西。开始看起来像水。

9、制作缓慢移动的大波浪

我们还想对波纹再做两件事,我要再复制这些节点,这组法线采样将做一些有趣的,比较大的缓慢移动的波浪,会穿过表面,它会打碎任何tiling。

对于这个uv的缩放常数0.003,我想使用个2维向量替代它,对于速度我将改为2.15,2.8.同样需要添加一个乘法来控制法线的强度。然后与上面2个滚动的涟漪法线贴图进行混合,并求出法线Z值。

上面两个法线是一个比较小的法线,下面这个是相对较大的法线。可以很好的完成降雨的涟漪波动。

10、把雨滴法线和涟漪法线混合(BlendAngleCorrectedNormals)

使用我们之前创建的天气波动函数Weather ripples,我将要添加另一个世界位置节点,乘以0.005,我要将其用于uv。我要给这些涟漪一个强度值,然后将它们与涟漪进行混合BlendAngleCorrectedNormals。所有水面涟漪都加在一起,让它们与雨滴涟漪混合在一起,这样可以在水面涟漪上添加上小水花,锦上添花。

这里你会看见水有水波纹,同时雨滴很好的击中了表面。

二、创建深度不透明度和深度颜色(水深着色器)

上面的步骤主要是在水面创建涟漪,接下来我们来创建深度不透明和深度颜色,先来看下效果:

明确我们将要制作的效果。我们继续在上面步骤中的效果进行制作:

我们已经拥有了涟漪和雨滴,还没有任何深度不透明和深度颜色。

1、修改材质混合模式

首先我们选择根节点,把混合模式修改为半透明Translucent。

这种设置将允许我们设置不透明度。

2、(水深计算)Scene Depth - Pixel Depth

有两件事情能够控制水的不透明度,一个是注视的角度;另一个是水深,水越深越不透明。因此我们需要来测量水的深度。我需要告诉你有两个节点可以用来测量深度,一个叫场景深度Scene Depth,另一个叫像素深度Pixel Depth。为了解释这两个节点,我们引入一些插图,可以直观的引导您了解这些节点在做什么?插图就是我们的场景,您可以看到在水的下方,有些岩石在水床上。

这里水面上有一个小图标,代表相机在那里。

我们需要测量相机到场景的距离,这就是我们的第一个节点场景深度。

场景深度测量的距离是相机到一直穿过的物体的距离(相机一直穿过的距离)(Scene Depth measures the distance from where our camera is all the way through the water to the bottom this sends a ray that goes through the current transparent object and hits whatever is behind it),这个节点给我的就是相机到水面以下东西的距离(this node gives me is the distance from my camera to whatever is behind my water surface)

另一个节点,我们叫像素深度,这个节点是做什么的?是给我们相机到水面的距离。

我们用场景深度减去像素深度就得到了一个向量,水面到水底的距离。蓝色的线段长度就是水面到水底的距离。这就是我们第一种计算水深的方法。

让我们回到虚幻引擎,来看看结果。添加一个减法节点.

结果我们让它除以一个值,水深的值100.超过这个距离值100cm,水变得完全不透明了。

也就是这个场景深度与像素深度的距离差除以100,距离如果是100,则正好是1,大于100则大于1了。

我们可以添加power节点,来控制衰减曲线

我们把power连接到基础颜色上来观察场景。

你会发现水越深,越白,越浅的地方颜色越暗。

数据传递到基础颜色,已经进行了伽玛调整,我们通过power(x,2.2)来进行撤销调整。

我们发现颜色已经正常了,特别是水面离石头很近的地方。

相机直视时

倾斜视角时

会随着相机角度的变化得到水深的不同角度值。Depth changes based on view angle。

实际上我们上面计算水深的方法并不是真正计算实际水深的方法,我们来看看真正的计算水深的方法应该是什么?

3、水深计算修正

真正的水深应该是相机击中水面时,直接向下,击中任何东西,然后计算深度的值。我们首先要获取场景深度和像素深度的值,取代减法的是我们要除以它们,添加一个除法节点,然后将场景深度除以像素深度,然后我想做的是把自己世界空间的定位,而且我也想要摄像机的世界位置,这样我就可以同时使用这2个功能,我使用它们我需要根据水的高度进行调整,所以我要创建第三个向量,得到一个位置。我的相机位置和世界位置,我需要为水的高度创建第三个向量,所以我要向向量添加个常量,设置为(0,0),高度我要添加自己的值,这就是我水的高度,切换回场景,选择我的水,发现其高度为70。

我将从相机位置和世界位置中减去第三个向量,我现在已经改变了在相机位置、绝对世界位置定位到了水高的空间,我将投射一条线从绝对世界位置到相机位置,使用减法,现在我要乘以这个值,

原理分析:世界位置减去(0,0,70),实际上得到的是从(0,0,70)指向世界位置的一个向量,而摄像机的位置减去(0,0,70),实际上得到的是从(0,0,70)到摄像机的一个向量,前面向量减去后面向量实际上得到的是摄像机到任一位置即世界位置的向量,这个向量的长度为pixel depth。方向也是(而pixel depth节点获得的只是这个向量的长度)。然后我们再让它乘以场景深度与像素深度的比值,就得到了从摄像机位置到水底位置的即场景深度的向量,让场景深度的向量加上摄像机到(0,0,70)水面中心的向量(加就相当于减减),得到的就是(0,0,70)到水底的向量,这个Z轴的值是负的,我们用1-就得到了正的,相差1,几乎忽略不计。这样我们就得到了场景深度位置的水深。

注释如下:

水深真正的效果应该为下图:

围绕我们场景移动,深度保持不变。

这里有个缺陷,如果水平面不平坦,比方说上坡上,你将无法获得这个值。可以使用这个近似值。多次使用近似值。

4、Fresnel

我们使用什么来测量我们的视角和水面的角度,我们使用Fresnel节点来进行。

它在眼睛向量和表面法线向量之间做点积,如果这两个向量是平行的,则返回1,垂直他将返回0值,还有一个指数值,在这里设置成3而不是5.这样我把这个值加到深度遮罩上去,钳制在0-1,这样就能得到正确的效果。

俯视时:

平视时:

此节点的法线应该是生成的法线,使用normalWS。

材质没有法线接口,我们需要修改材质的照明模式为表面半透明。

同时把涟漪与水滴的混合法线连上。

修改后,运行效果为:

5、水面与突出石头边缘的软化(Depth Fade)

使用Depth Fade对水面和石头的边缘进行过渡软化,此节点可以修改淡入淡出的距离,可以更改为30,节点及运行效果图如下:

我们一直都是把不透明度传递给颜色,方便查看,现在给不透明度,看看效果如下图:

6、给水添加颜色

我们需要做的最后一件事情是为水添加颜色,上图中水默认的颜色是深黑色。水的深度变深时颜色变深,所以我们需要线性插值节点,根据不透明度蒙版在浅蓝色和深蓝色之间过渡。

运行效果如图:

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

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

相关文章

华为面试题及答案——机器学习(二)

21. 如何评价分类模型的优劣? (1)模型性能指标 准确率(Accuracy): 定义:正确分类的样本数与总样本数之比。适用:当各类样本的数量相对均衡时。精确率(Precision): 定义:预测为正类的样本中实际为正类的比例。适用:当关注假阳性错误的成本较高时(例如垃圾邮件检测…

小山菌_代码随想录算法训练营第三十五天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 文档讲解&#xff1a;代码随想录.斐波那契数 视频讲解&#xff1a;手把手带你入门动态规划 | LeetCode&#xff1a;509.斐波那契数 状态&#xff1a;已完成 代码实现 class Solution { public:int fib(int n) {if (n < 1)return n;vector<int> dep(n…

基于SOAR模型的面部情绪识别

摘要 情绪表达在日常交流中起着特殊的作用&#xff0c;而检测情绪最重要的方法之一就是识别面部情绪状态。因此&#xff0c;自然人机交互的关键点是识别面部表情并根据感知到的情绪提供反馈。模型的实现涉及两个主要步骤。第一步是读取视频并将其转换为图像&#xff0c;然后对…

iOS包ShaderVariantCollection预热慢问题

1&#xff09;iOS包ShaderVariantCollection预热慢问题 2&#xff09;使用SBP打Bundle如何读取AssetBundleManifest 3&#xff09;如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用 4&#xff09;为什么我的水这么干净&#xff0c;和UE教程里的有差别 这是第392篇…

Pandas 学习笔记(一)

一、pandas简介 Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析。 Pandas 名字衍生自术语 "panel data"&#xff08;面板数据&#xff09;和 "Python data analysis"&#xff08;Python 数据分析&#xff09;。 Pandas 是一个开放源码…

ubuntu 18.04 server源码编译安装freeswitch 1.10.11——筑梦之路

前言 这里主要编译支持语音通话、视频通话、短信、webrtc功能的PBX。 安装编译工具包和依赖包 sudo apt-get updatesudo apt-get install -y autoconf git libtool g zlib1g-dev libjpeg-dev libcurl4-openssl-dev libspeex-dev libldns-dev libedit-dev libssl-dev pkg-con…

百问网全志D1h开发板投屏功能实现

投屏功能实现 D1系列号称点屏神器&#xff0c;不仅能点屏&#xff0c;还能用于投屏。 源码准备 百问网为 【百问网D1h开发板】提供了投屏功能需要使用的源码&#xff0c;直接git下载即可&#xff1a; git clone https://github.com/DongshanPI/DongshannezhaSTU_DLNA_Scree…

平板WPS转换的PDF文件保存位置解析

在日常工作和生活中&#xff0c;我们经常需要将文档转换成PDF格式进行分享&#xff0c;以确保接收者能够无障碍地查看文件内容&#xff0c;不受软件版本或操作系统的限制。WPS作为一款功能强大的办公软件&#xff0c;也提供了文档转换为PDF的功能。然而&#xff0c;有时在转换并…

基于振弦采集仪的工程安全监测技术研究与应用

基于振弦采集仪的工程安全监测技术研究与应用 随着工程规模的不断扩大和复杂性的增加&#xff0c;工程安全监测变得越来越重要。工程安全监测的目的是保证工程的安全运行&#xff0c;预防事故的发生&#xff0c;保护人们的生命财产安全。其中&#xff0c;振弦采集仪作为一种重…

【Vite】控制打包结构

配置 vite.config.json 文件&#xff1a; import { defineConfig } from "vite";export default defineConfig({// ...build: {rollupOptions: {output: {entryFileNames: "js/[name]-[hash].js",chunkFileNames: "js/[name]-[hash].js",assetF…

【Android八股文】如何对ListView RecycleView进行局部刷新的?

文章目录 一、如何对ListView进行局部刷新的?1.1 方法一:更新对应view的内容1.2 方法二:通过ViewHolder去设置值1.3 方法三:调用一次getView()方法1.4 封装在万能适配器当中1.5 总结二、如何对RecyclerView 进行局部刷新的?2.0 为什么会有DiffUtil?2.1 讲解一下DiffUtil2…

JOSEF约瑟 JOLP(ROS-2D)型两级跑偏开关 精度高,耐振动

​ 品牌 :JOSEF约瑟 型号名称 :JOLP(ROS-2D)型两级跑偏开关 触点容量 :AC380V 10A 触点数量 :常开:2常闭:2 极限角度 :70 复位方式 :自动 动作力 :3kg 防护等级 :IP66 结构特点 1.通用的安装设计可使跑偏检测装置随意安装在输送机纵梁顶!顶部或底部位置 2.封闭、防腐、坚固的铸…

3D数字人视频合成用户指南

数字人开放平台3D互动数字人如何接入_虚拟数字人(DVH)-阿里云帮助中心3D互动数字人&#xff08;对应开放平台的“智能客服”场景&#xff09;是虚拟数字人开放平台提供能够支持用户与3D数字人进行实时语音交互的数字人产品能力&#xff0c;需要配合智能对话机器人产品使用。本篇…

安装appnium

官网&#xff1a; https://appium.io/docs/en/latest/quickstart/uiauto2-driver/ 安装Node.js 首先&#xff0c;确保安装了Node.js&#xff0c;因为Appium是基于Node.js的。可以从Node.js官网下载并安装最新稳定版。安装Appium Server 你可以通过npm&#xff08;Node.js的包管…

徐徐拉开的帷幕:拜登与特朗普的辩论大戏 日元跌破160大关!创1986年以来最低纪录

北京时间6月27日&#xff08;本周五&#xff09;上午9:00&#xff0c;拜登和特朗普将参加2024年总统候选人电视辩论。作为参考&#xff0c;2016年大选辩论期间&#xff0c;美元汇率对辩论结果的反应相对温和&#xff0c;希拉里胜选预期增强在一定程度上支撑了美元。 时间逐渐临…

Java - 程序员面试笔记记录 实现 - Part1

社招又来学习 Java 啦&#xff0c;这次选了何昊老师的程序员面试笔记作为主要资料&#xff0c;记录一下一些学习过程。 1.1 Java 程序初始化 Java 程序初始化遵循规则&#xff1a;静态变量优于动态变量&#xff1b;父类优于子类&#xff1b;成员变量的定义顺序&#xff1b; …

python运行相关

一、check python是否仍然在运行 Windows 操作系统下用任务管理器查看 打开任务管理器&#xff1a;Ctrl Shift Esc 查看进程列表&#xff1a; 在“进程”选项卡中&#xff0c;找到与 Python 相关的进程。 检查CPU和内存使用情况&#xff1a; 如果数值在不断变化&#xf…

Spring的jar包下载(最新版6.0版本)

1.在Spring官网的projects下面点击spring-framework 2.进入github官网 3.进入github后往下滑&#xff0c;点击Spring Framework Artifacts 4.往下滑找到 点击 5.在左边先点击Artifacts&#xff0c;在右边找到 libs-snapshot&#xff0c;展开libs-snapshot&#xff08;之前其他…

React Hooks小记(九)_useMemo 和 memo 函数

useMemo 和 memo 函数 1. memo 函数 当父组件被重新渲染的时候&#xff0c;也会触发子组件的重新渲染&#xff0c;这样就多出了无意义的性能开销。如果子组件的状态没有发生变化&#xff0c;则子组件是必须要被重新渲染的。 在 React 中&#xff0c;我们可以使用 React.memo…

k8s及常用对象简介

文章目录 一、k8s是什么应用程序早期部署形式容器的引入k8s的作用 二、k8s中的常用对象1、Node获取node信息 2、Namespacenamespace的使用 3、Pod生命周期pod的使用 4、DaemonSetDaemonSet的使用 5、Deployment创建deploy 6、ReplicaSet7、StatefulSet创建StatefulSet 8、更新操…