UE4 Material 101学习笔记 | 您所在的位置:网站首页 › ue4地形贴图后像马赛克 › UE4 Material 101学习笔记 |
UE4 Material 101学习笔记——23-29 水涟漪/水深/折射反射/Gerstner海浪/波光焦散/泡沫/FlowMap
Lec23 水的表面涟漪 Water Ripples Shader1 法线图与panner2 世界位置投影与多次叠加
Lec24 水深着色器 Water Depth Shader1 水深测量——SceneDepth与PixelDepth2 水的透明度——角度3 水的颜色渐变
Lec25 水体反射和折射 Water Reflection & Refraction ShaderLec26 Gerstner算法的海浪 Water Gerstner Waves1 交界修正2 曲面细分3 Gerstner算法与实现4 材质函数构建5 整理
Lec27 波光焦散 Water Caustics1 贴花 (decal)2 制作—纹理/扰动/世界坐标投影
Lec28 浪花泡沫 Water Foam1 泡沫贴图2 边缘出现
Lec29 水流映射 Water Flow Maps1 FlowMap绘制与使用2 材质函数应用3 后续使用
本系列学习资料来源,Ben Cloward的油管空间,B站的搬运翻译 接下来的这个系列是一组新的关于水的shader 先来看看水吧 水有很多很多特征,但是我们会专注于实现以下这些 原视频地址,内有本节的贴图链接 首先我们需要一个较好看的水的法线贴图,去goole上搜一搜
但是这样存在一些问题 它移动的很快,真实的水的运动是很混乱的,但目前动的太统一了 我们把panner节点的输出接到UV上,在前面使用世界位置投影,让水只在XY平面有 于是进行改动,可以把Speed连出来的常量改成二维向量 我们如果多次复制以上这一组合,那么就可以在涟漪中制造一些混乱 也就是多次采样法线图,朝着不同方向滚动,进行叠加 除了波纹,我们还可以再复制一组法线,调慢速度制造慢一点的波浪 甚至我们还可以把之前写雨滴涟漪的方法放进来 在进入这节之前,我们可以先看看最终的完整的水的着色器会是什么效果 下面第一件事,在上一节shader基础上,选择混合模式为半透明 有两个因素会影响水的不透明度,一个是我们看水面的角度,一个是水的深度 1 水深测量——SceneDepth与PixelDepth所以我们需要有一种方式去测量水深 下面介绍第一种方式 该方式有几个节点可以用到,SceneDepth和PixelDepth 我们用一张图来辅助理解这两个节点在干什么 Scene Depth返回从相机方向开始,到场景最近的一个像素。会忽略透明物体 Pixel Depth返回从相机到这个半透明水面的距离 两者相减得到一个新矢量,也就得到了一种深度 但是存在一些奇怪的现象 以下是我们垂直看的效果 计算的深度是深紫色的深度,然而浅色的深度才是真正的深度 因为之前的两个depth,引擎都帮我们算好了值,所以我们来相除,得到比例 通过相机位置减去世界位置,得到Pixel depth的向量值,乘以比例得到Screen depth的向量值,两个向量相减,拿到Z的差距,也就是深度了(原视频的做法我无法理解,于是用自己的方法了) ![]() 可以看到用自己的方法“水深”也是不变的 影响水的透明度的因素还有看水面的角度,我们会使用Fresnel节点 ![]()
我们还知道,如果深度改变会变颜色,所以我们可以插入颜色
为了更好的表现反射和折射,我们把此前的链接都断开,只是给一个粗糙度常数为0 这就要涉及UE4中反射的实现方式,反射是很复杂的,一般来说在UE4中有5种不同的实现方式,UE4中许多场景都是采用多种反射方式组合使用 这里介绍其中三种 第一种就是天空盒,正如图上所示,但是如果我们要反射更近的局部对象呢? 也就是Light Probe光照探针 在默认的场景中,这个图标的名字是球体反射捕获,它做的事情,是从这一点开始,捕获一个cubemap,然后将该cubemap用于创建反射 但是还是有问题的,因为这只是从探针那个点来说是正确的,一但移开就有错误 第三种方法是屏幕空间反射 关于这个方法就要回到shader的根节点上,勾上红框中的选择 在这节中,我们会为我们的水加上几何波 1 交界修正我们现在是有水的波纹,但是它很小,并且观察交接处只是僵硬的连在一起 但是,回到之前的shader,我们发现水面交界处有这种绿线,看着很奇怪 我们注意到,这个折射效果各处都一样 接下来我们正式可以进入本节几何动画的内容了,我们用线框模式查看场景,可以看到我们所用的水面,其线框是很稀疏的,三角形不多 如果就这样进行几何移动,我们会有很粗糙的动画效果,我们进入shader的根节点,设置曲面细分,这样就能方便对顶点进行动画处理 到这里,我们终于可以开始操作几何了,通常的我们会使用这个 我们会使用数学公式来模拟海浪,也就是Gerstner公式 关于Gerstner方法,这里找到了几篇很不错的博客 水面的简单渲染 – Gerstner波 Gerstner 水波详解 大意如下,一般的波动效果,诸如sin函数,只是顶点y坐标在时间函数下上下波动,顶点根本没有发生水平移动。 但是实际的水不仅仅只有表面。下面还有更多的水。 当表面的水向下移动时,其下方的水会怎么运动?当表面向上移动时,什么填充了其下面的空间? 事实证明,表面点不仅向上和向下移动,而且也向前和向后移动。 它们有一半的时间与波一起移动,而另一半则沿相反的方向移动。表面以下的水也是如此,但越深,运动就越少。 下图为正弦波与Gerstner波 我们直接在材质编辑器中开始做(说实话后面它这么连到最后实现这个波,我是不明觉厉的,求大神细细理论分析,我爬了.jpg) 以下节点连到世界场景位移中 Gerstner算法的一部分是进行坡度控制,但是我们现在还没有添加,所以看起来这个运动是非常平滑的 Gerstner算法能让我们有控制波峰尖锐与否,以及波浪是否陡峭的能力,于是我们接着实现 同时调整一下数据,让其更尖锐,效果更明显 首先我们改变了表面的形状,但是我们却没有改变法线,所以就会感觉虽然动起来很像波,但是看着还是光照很平坦的样子 所以我们需要重新计算法线,新算一份法线,结合之前的法线
于是我们想要构建材质函数,来通过多次调用,可控地实现这个功能 4 材质函数构建将gerstner的方法进行材质函数的构建 好的,我们来整理和调整一下 本期的视频地址,内有本节用到的贴图链接 在制作之前,首先我们看看真实生活中的样子是什么样的 贴花(decal)在游戏里面是运用的比较多的,因为他可以简单的把图片运用不同的叠加方式绘制到另一个物体的表面,比如说游戏中的脏迹,脚印,弹孔和血迹等,都是贴花的效果。 这里找到一些介绍 unreal|Decal贴花拉伸 UE4延迟贴花----简单介绍 UE4: How to Create Your First Decal Material Tutorial UE4: How to Insert, Apply and Use Decals Inside Your Level Tutorial![]() ![]() 我们使用decal的原因,是我们想要这些焦散的效果投射到水下的所有东西上,但是又不想要去该shader 如下图,在绿框内的所有物体都会附上焦散效果 下面我们开始做 新建一个材质球,在其根节点进行设置 我们开始连节点 拆分如下,世界坐标投影 两组纹理和扰动 本节视频地址,内有所使用的贴图链接 1 泡沫贴图在这一节,我们要在26节水的着色器基础上加一些泡沫 一般来说,水的泡沫发生在与其他物体相撞很迅速的时候 在自己做的小场景,加上泡沫可能不太合理,不过我们也依旧试着做做。 我们首先用到一个泡沫贴图,它的三个通道图片如下,三种不同数量的泡沫 因为泡沫它不是可以均匀混合的东西,它是致密的或者稀薄的,所以有三个mask,分别是薄中厚 接下来还有一个渐变图,依然是三个通道 泡沫出现表示为在左边是黑的,然后根据消失速度的不同,设置渐变 用来控制泡沫的数量 我们在使用纹理时,需要用到一个引擎自带的材质函数,右键func,选择MaterialFunctionCall,按照如下寻找到这个函数 为了控制泡沫出现的地方,我们会使用之前用过的深度图,让泡沫只在边缘出现 divide连出来的是这里 结果会是这样 这是一种用法,我们只用深度添加泡沫 但是我们也可以自己绘制mask,让mask投影在世界坐标下,去控制渐变图的UV 我们也可以在Gerstner的波峰的地方加入泡沫,通过数学计算,去控制渐变图的UV Lec29 水流映射 Water Flow Maps这一节我们要做FlowMapping 什么是FlowMapping? 我们此前做了水的shader,也有涟漪,但是这些涟漪(ripples)没有一个主要的方向,它只是泛泛的涟漪 但是如果我们想要制造一条溪流呢?他们有特定的流动方向,或者我们想要精确定义方向的时候该怎么办呢? 1 FlowMap绘制与使用这时候,FlowMap就可以做到这一点,我们可以绘制一个纹理,其中每个像素都代表了流向,然后我们在shader中用它来移动涟漪。 我们可以用一个叫做FlowMap Painter的程序来绘制它,软件地址在这里
UE4自带了一些相关的FlowMap的函数去使用,但是我们本节的目的是了解其背后的数学原理 简单示例,可以看到这种扭曲效果带来的影响 我们基于此,制作材质函数 在shader中使用 这是一种通用的FlowMap的使用方式,在实际使用中,我们更可能使用顶视图观察场景
|
CopyRight 2018-2019 实验室设备网 版权所有 |