Unreal4材质表达式实用表达式类节点讲解0015

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unreal4材质表达式实用表达式类节点讲解0015相关的知识,希望对你有一定的参考价值。

参考技术A utility:实用、效用、公共设施、公用

实用程序表达式节点是可以以不同于过去的多种方式影响材料的节点。例如,GIReplace节点将使用您输入的给定值替换对象间接反射颜色,而“线性插值”节点将帮助基于Alpha输入在两个“纹理”之间进行混合。在接下来的页面上,您将找到UE4材质编辑器中可用的所有Utility Expressions节点的详细说明。

DDX表达暴露DDX导数计算,在像素着色器计算中使用的GPU硬件特征。

所述DDY表达暴露DDX导数计算,在像素着色器计算中使用的GPU硬件特征。

距离表达式计算两个点/颜色/位置/向量并输出所得到的值之间的(欧几里得)距离。这适用于一个,两个,三个和四个分量向量,但是表达式的两个输入必须具有相同数量的通道。

所述DistanceFieldGradient材质表达式节点,归一化时,输出X,Y,Z方向上的物体将与在距离场移动。这使得“距离场渐变材质表达”节点非常适合需要模拟液体流动的材质。

“到最近的表面材质表达”的“距离”节点允许材质对“全局距离字段”级别中的任何点进行采样。材质表达的工作方式是:以世界空间单位输出从距离字段到场景中最近的遮挡物的有符号距离。

该特色水平开关节点可以让简化材料低功率设备。
用法示例:您可能拥有一种材质,该材质具有10个重叠的纹理和复杂的数学运算,但只有一个用于移动设备的静态纹理(功能级别ES2)。

GIReplace允许艺术家在将材料用于GI时指定不同的,通常更简单的表达链。
用法示例:Lightmass静态GI和LPV动态GI使用它。

程序员: LinearInterpolate根据参数值Alpha在A和B之间执行每通道的套索。

“噪声”表达式创建一个过程噪声字段,使您可以控制其生成方式。

使用上一帧切换材质表达,您可以支持 在材质中实现的复杂顶点动画以生成正确的运动矢量,以便它们可以与时间AA和运动模糊一起正常使用。

仅作为时间函数的材质无需修改即可工作,但是,它们无法说明可能影响动画的其他变量,例如“材质参数”。以前的帧切换材质表达使美术人员可以通过跟踪这些参数的变化方式来手动解决这些类型的问题,例如在“蓝图”中,他们可以手动提供由帧之间的“世界位置偏移”变化引起的运动矢量生成的表达。

必须在“渲染”下的“项目设置”中启用来自顶点变形的速度,此表达式才能起作用:

所述QualitySwitch表达允许使用基于发动机的质量水平,如使用低质量在低端设备之间交换的不同表达的网络。

在下面,您将找到矢量噪声材料表达式中各种噪声函数的描述。

Building Worlds In Unreal 学习笔记——31-33 天空与雾气/体积云参数与材质分析

本系列学习资料来源,Ben Cloward的油管空间,B站的搬运翻译

Lec31 天空与雾气 Unreal Sky & Atmosphere

本节为场景增加雾气和大气
这是我们之前的场景,多少感觉整体有些平淡,主要是因为光照没调整过
作为一个巨大的户外场景,它缺少了场景的深度感以及大气的氛围感

当我们最开始选择TimeOfDayd的关卡模板时,它会默认给我们配置一些东西

也就是最后这五个,它们会被默认配置

我们其实可以自己手动添加一些诸如雾气,光束的效果

1 Directional Light & SkyAymosphere

首先我们来看这两者的关系
点击Directional Light,鼠标移到场景中,按住Ctrl+L,鼠标长按后松开,就会出现右下角这个小标志,随着鼠标移动可以自由移动Directional Light的方向

当把太阳在上面时,场景和云层是白的,当太阳拉到地平线的时候,场景就会变成黄色

这种模拟大气的效果由SkyAtmosphere中的瑞利散射参数和米氏散射参数来控制

尽管这些参数让大气在日出日落时变黄变红了,但是场景的深度感还是没有达到,其实也就是没有雾

2 Fog

于是接下来我们添加一下指数雾

把它一拖进来,就会发现效果有了,就是雾太多了

并且自带的雾气颜色会覆盖之前的散射效果,我们调整一下,让雾气颜色继承大气颜色,在project setting里找到这个,打钩,然后重启

因为雾气的参数会和原本的大气效果相加,所以在重启后把雾气颜色和方向都设置成黑色,这样我们的颜色就都是大气里拿来的颜色了

当拉到日出日落的时间时,雾气呈现黄色

如果打开体积云,很好看

3 Light Shaft

打开Directional Light里的Light Shafts选项,把LightShaftOcclusion和LightShaftBloom勾上

得到如下效果

LightShaftOcclusion的功能是,当某块区域挡住光线时,那块区域的雾就会变暗,得到暗暗的光束
LightShaftBloom的功能是,当光线很亮时,添加bloom

如果太阳会一闪一闪的,可以调低BloomScale和BloomMaxBrightness

Lec32 体积云设置 Volumetric Clouds

本节介绍六个关于体积云的外观和性能的参数设置

为了衡量性能,我们打开GPU cost

总毫秒数8.82,体积云是1.03

如果关掉体积云,可以看见场景渲染的毫秒数下降了,变成了7.21,并且下降的量比体积云本身的毫秒数多,这意味着体积云的一些成本也隐藏在其他指标中

所以我们在参数设置时,既要看体积云本身的消耗,也要看整体的消耗

1 Layer

首先是体积云组件的Layer参数

  • Layer Button Altitude设置为5km,Layer Height设置为10km
    这两个参数控制云层的开始和厚度
    比如现在就是从场景上方5km开始,云层走过10km
    关于这个是什么含义,我们需要了解一下云层构造(下图选自世界气象组织的网站

    动态调节一下这两个参数,效果很明显

    性能上来说,Layer Button Altitude影响不大,Layer Height控制云的厚度,性能消耗高一些
    比如设置成4和3的时候,消耗降低了一些,云层薄了一些

2 Multi-Scattering

打开云层材质

打开母材质

打开云层的材质,在下一节我们再看看这材质在干什么

找到Advanced Output的输出节点,可以看到Multi-Scattering的参数

光线打到云层表面,不是直接被一个硬表面反射,而是打到云层中的小液滴继续散射到内部
在实时渲染中,复杂的多重散射效果是通过对实际散射过程的近似模拟来实现的,具体来说,通过在体积材质中追踪透光率的多个倍频(或步骤)来实现
在UE4中,用Multi-Scattering的参数来近似光线散射
如果把它拉成2,消耗会变多
对于实时来说设成1就可以,对于一些高画质要求的可以设置成2

3 Ray Marching / Beer Shadow Maps

接下来看看云层如何在它们自己身上投射阴影
默认所用 光线步进(Ray Marching) 以及 Beer阴影贴图(Beer Shadow Maps) (BSM)。

可以在所用的云材质内切换两个模式,在Volumetric Advanced Material Output的细节面板的中的光线步进体积阴影(Ray March Volume Shadow)选项上勾选来进行切换

Ray Marching就是将射线投射到体积中,不断沿着射线采样看该位置是否有被云的结构遮挡,这个方法性能消耗高,但是质量好
Beer Shadow Maps就如图名字描述,使用shadermap,消耗较低
我们切换成Shdow Map的方式来看看(也就是去掉勾选)

首先是RayMarching的方式,如下图

然后是ShadowMap的方式,如下图,可以看到云的阴影很实,消耗降低了

4 Cast Cloud Shadow

接下来看看云层的投射阴影,打开方向光

中间那两个需要我们在云层上,并且有足够大的东西投影到云层上才有用,我们的场景里没啥用

第四个√可以看一看
打开时是这样

如果取消掉,没了阴影,云就变亮了,对整体性能影响不大,但是对效果影响很大

5 Cloud Ambient Occlusion

打开SkyLight的这个组件

把它取消掉会亮一点,它的作用是给云一个AO,对性能影响不大,可以开着

6 Transmittance

最后一个设置是体积云组件的这个参数,不开启代表全局都用一个Transmittance值,开启的话则是计算具体的Transmittance值

对整体云的质量是比较有影响的,性能上消耗不大

7 效果

各个参数根据需求调整,看看现在的场景效果

Lec33 体积云材质 Volumetric Cloud Materials

本节来解析默认的体积云材质

原本那个连线图太乱了,把它整理一下

从大局来看,我们先创建一个云的BaseShape,然后再创建一个云的NoiseShape,把这两部分通过Height来lerp到一起,然后由一些参数控制消光(extinction)和颜色

云层底部是形状平滑的BaseShape,云层顶部是比较嘈杂的NoiseShape,可以从场景中看到效果

一步步解析

1 BaseShape

先看根节点,体积渲染,叠加模式为additive

然后看材质最左边
世界坐标位置配合一个scale参数,为之后云层的采样提供坐标
时间配合方向参数,为云层运动提供参数

而后两者相加进入BaseShape,配合再乘以一个参数控制基础的噪声尺度,然后去采样我们的三维纹理

来看看这个三维的纹理是什么,是一个个分块,看着很像序列帧,或者flipbook里的纹理

但其实这些一块块的东西是一个三维纹理的切片,制作时可以用数学方法先生成噪声,然后在渲染出图的时候切片分割出图

换一种显示方式可以看到一个正方体的纹理,这是云材质的基础

而后进行一个指数调整,相当于增加对比度

我们来控制一下BaseNoiseScale和BaseNoiseExp这两个参数
调整一下Scale,随着这个值的变化,体积纹理就被tilling了不同的次数,找到重复感不严重又能有细节的值就好

调整指数的值,则是对于噪声纹理的对比度进行了调整,可以控制云层的颗粒度是厚实还是分的很细

这时候在BaseShape部分还有一个东西,就是这个Input,它提供了一个ConservativeDensity的参数

这个参数从哪里来呢,这就要看到该材质内的独立的一个部分

2 Volumetric Advanced Output

有上面那个Input,是因为我们在这里输出了一个Volumetric Advanced Output,这个输出节点是对于体积材质特定的,其最后一栏有一个ConservativeDensity
可以看到左边有一串节点计算了这个值

左边这串节点做了什么呢?它们定义了云的外形,然后输出给ConservativeDensity,再与BaseShape里的噪声纹理进行相乘,得到BaseShape
我们可以试试看只输出这个值

可以看到cloud只有基本形状,没有了噪声


我们来具体看看左边那一串节点做了什么

先看一部分拿到世界坐标位置,加上一个系数,只要XY,乘以一个系数控制比例(到这里很正常,像是一个投影而已),然后采样一个纹理

  • 这个纹理是什么?我们可以看一看用到的这俩通道是啥
    R通道,云层底部的形状

    G通道,从底层到高层的云的,值从黑到白

采样过后,再看后面的节点

  • 绿通道power一下,作为UV值的U(越靠近高层云的位置,U越大)
    1-CloudSampleAttributes作为UV值的V(CloudSampleAttributes这个值带来了云层的标准化高度,下0上1,然后1-来反转一下,下1上0)
    通过这个UV去采样一个图(上图左边显示的那个形状),也就是云的横截面图(U在横向移动,V在纵向移动)
    场景中把这个截面图采出来大概就是这样

    把这个结果和红通道相乘,就可以得到一个三维的有云的轮廓
    后面那个custom节点就是判断CloudSampleAttributes如果不在指定范围,就把输出归为0
  • 通过一个从上往下看的纹理和横截面纹理,就重建出了天上的“云空间”
    为什么要建立这个“云空间”呢?因为我们不可能真的渲染这个天空,ConservativeDensity的定义会让我们会在我们需要的地方去做计算,ConservativeDensity为0时,也就是云不存在,也就不需要计算体积了
    所以ConservativeDensity也就相当于是一个空间密度,定义了这个密度,可以节省不必要的计算

3 NoiseShape

在进入NoiseShape的那些节点之前,我们来看看BaseShape的输出是什么(把lerp的节点输出替换成BaseShape的结果)

从上到下,所有噪声的分布都是一样的

而在我们原始的云材质中(下图),效果是明显上面的云更加细碎

这就是NoiseShape的作用,打破tilling

在节点中,我们在采样的第二个三维噪声(一个分辨率比较低的三维噪声),其用的time是乘了-0.1,和BaseShape的运动相反,其Scale也比BaseShape来的大,Exp和Strength来控制这个高频噪声的强度(如下方动图)


然后传入BaseShape的值,进行Remap

4 lerp

根据BaseShape,NoiseShape,以及高度的值(也可以根据参数调整),进行插值,插值结果乘以颜色和Extinction

5 拓展

可以去plugins里找到volumetric插件,里面有很多样例和贴图
以及在Ben佬这个视频下面,有人推荐了这个自制体积云的视频,也可以学习学习

暂时放着之后来补,期末了,开冲!

以上是关于Unreal4材质表达式实用表达式类节点讲解0015的主要内容,如果未能解决你的问题,请参考以下文章

UE4/Blender 实用材质节点笔记

001 lambda表达式的引入

Unreal4Lightmass全局光照讲解0036bate1

swift 用于正则表达式的Swift实用程序类

Unix Shell范例精解---AWK练习(上)

实用代码小知识| PHP常用正则表达式汇总