什么是反射和折射向量?如何使用?创建自定义效果超引擎效果!【Ben图形/24】...
反射教程Game艺视界原创 15254 0
实名

通过了实名认证的内容创造者

发布于 2022-3-21 22:11:13

您需要 登录 才可以下载或查看,没有账号?注册

x
b64e78dc188da7f93a16111abbb1eb9.png

本期内容
今天我们将介绍反射和折射向量让我们开始!
继续在今天的视频中我将解释,什么是反射和折射向量
然后我将向您展示如何,在虚幻和Unity中创建和使用它们

3b296085c7a73dfa3d3bdb0389f03936.png


在我深入之前,我必须指出大多数现代游戏引擎都内置了反射如果我想在我的表面上看到反射我可以将颜色和金属设置为1,我可以将粗糙度设置为0

我有反光材料,可以反射环境引擎在引擎盖下为我做了很多工作以产生这种效果,我想在这个视频中做的是向你展示它是如何工作的,以及是什么发生这种情况将帮助您了解正在发生的事情。并允许您创建自己的自定义效果超出引擎已提供的效果

因此让我们看一下图表以了解反射和折射的工作原理,所以这里我们有一个表面,表面所面对的方向由表面法线表示,这里的红色箭头表示我们正在看表面的方向也称为相机矢量

由这个绿色箭头表示所以我们在这个方向重新观察表面

所以当我们仔细观察表面时,我们会看到什么如果我们想知道表面上反射的是什么,我们需要创建一个反射向量 ,它基本上是我们在表面法线周围,镜像的视图方向向量然后我们可以使用该反射向量来查看环境,以查看那个方向上有什么

在我们今天的示例中,我们将使用立方体贴图来表示类似于反射向量的环境。我们还可以计算折射向量,这个向量表示光线穿过表面时的弯曲程度,为了计算这个向量我们需要知道折射率F或者我们开始使用的材料通常是空气,以及我们撞击的表面的折射率通常是玻璃或水之类的东西。我会在制作折射着色器时对此进行更多解释,但只是就像反射一样如果我们使用这个折射向量,对立方体贴图进行采样我们将能够在我们的模型上看到折射的结果

好吧,让我们切换回虚幻看看我们如何在着色器中使用它,所以在这里我们在虚幻中我们有我们的反射向量节点,我们可以通过打开我们的搜索器并输入反射并添加反射向量 ws 来获得其中一个,ws 代表世界空间,因为我们正在计算世界空间中的反射向量所以在我们的图表中,为了计算反射向量我们需要摄影机向量和法线,但在这种情况下,我们的反射向量节点只是使用了来自虚幻的摄影机向量,所以我们不需要提供我们只需要给它法线

让我们搜索我们的法线 ,在我们的例子中,我们将使用顶点法线世界空间,但我们也可以为此使用像素法线

所以让我们选择顶点法线世界空间,并将其插入我们的自定义世界法线 ,现在我们已经计算了反射向量如果你想看看它看起来像什么,我可以将它连接到颜色中你可以看到它有点计算看起来很疯狂的颜色

但我们现在所做的是计算反射的方向以便实际看到反射, 我们需要使用立方体贴图虚幻内置了立方体贴图 ,如果我将粗糙度设置为零并设置我的金属到一个,但在我们的例子中,我们将使用自定义立方体贴图 ,所以我将在这里添加一个纹理样本

然后我将来到这里并选择纹理以对我的内容进行采样可以做的就是选择,以对我的内容进行采样可以做的就是选择我可以在搜索中键入cube,这里所有的立方体贴图都已命名, 因此它们的名称中有一个立方体

选择好我们的立方体,好吧,我将把我的反射向量连接到我的纹理样本节点的UV中如果我连接我的纹理的结果到基色中,你会看到现在我在我的模型上反射了这个史诗般的办公环境

如果我像以前一样如果颜色和金属设置为1,将粗糙度设置为0我现在正在对引擎自动创建的立方体贴图进行采样

但是如果我使用反射向量现在在这里采样这个纹理,我实际上正在对我选择的立方体贴图进行采样,因此我可以使用这种技术来创建与环境完全不匹配的自定义反射效果

所以让我们看一下另一个示例,我可以在这里选择一些不同的立方体贴图,在搜索中输入立方体您可以看到它不再与我的对象所在的环境相匹配,您可以看到它不再与我的对象所在的环境相匹配。因此如果我想使用它在我的对象上创建某种不匹配的反射,实际上存在于现实中我可以使用反射向量,加上带有立方体贴图的纹理样本来创建各种与引擎通常提供的效果不完全匹配的自定义效果

因此再次说明我的情况,视图向量或相机向量和我的法线在反射向量中一起计算反射应该来自哪个方向,然后该方向被用作我的立方体地图的查找它代表了模型周围的环境,然后我得到了一个结果是反射的颜色, 然后我可以将其传递给基色。如果我想创建反射,我也可以将其用作自发光上面没有任何照明,所以这就是反射向量的工作原理,我可以计算我的反射向量 ,然后用它来很好地采样立方体贴图

让我们看看折射, 所以使用折射节点

你可以看到我有这个输入称为光线方向 ,如果我想计算一个折射例如我正在透过玻璃物体看,那么我的光线方向是相机矢量,所以让我们引入其中之一所以我要寻找相机方向向量

我将把它传递到我的光线方向然后它也要求表面法线 ,就像反射向量一样我可以传递这个顶点法线或像素法线,其中任何一个都可以工作。所以我将通过表面法线现在它要求折射率原点和折射率目标。所以为了理解这一点我现在需要查找这些值,如果我只是将鼠标悬停在它上面它说默认值为1折射率原点和折射率目标的默认值是1.33, 所以它说它默认为水的折射率 1.33所以这是假设我正在击中这个球体对象的表面

我的预览对象是在这里制作的现在出水了,如果我想要它是玻璃或其他一些物体我需要查找该材料的折射率。所以让我们快速查看一下我们在维基百科上, 有一个非常方便的折射率列表,如果我来这里我们可以看看它说空气的折射率是1.000293,所以这非常接近我们在虚幻中的默认如果我们到这里来,我们就能看到水的折射率为 1.33,再向下滚动一点我们可以找到 1.52 的平板玻璃

所以让我们切换回虚幻我将输入 1.52 作为我们的折射率。好的,让我们把它连接起来现在我们有了一个向量,这是我们的折射向量,记住这基本上是我们的视线方向撞击表面然后弯曲,穿过另一侧所以我们在这个例子中看到的是物体的另一侧森林,好像我们正在透过这个球体看如果它是由玻璃制成的另一边,所以现在我要把这个向量和电线连接到我的立方体贴图纹理查找中现在你可以看到,它看起来我们的森林是倒置的为什么光线在穿过我们的玻璃球时会弯曲,这里和玻璃球有点像放大镜给我们折射 ,
所以我们有这样的反射
我们有这样的折射

如果我们想创造一些看起来像现实玻璃的东西,我们需要的是折射我们如何做到这一点为了获得反射和折射,我们需要对我们的立方体贴图采样两次, 一次用于折射 ,一次用于反射然后我们可以使用 lerp 节点,在这两个样本之间进行混合所以让我们添加 一个lerp 现在我们要添加一个菲涅耳节点
这样你就可以看到菲涅耳我们边缘变白,中间变黑

所以我们想要做的是我们想让这个白色代表我们的反射 ,这个黑色代表我们的折射所以我们将把反射的结果连接到b插座中这也是我们用白色得到的结果,我们将折射的结果重新连接到我们的 lerp 的插座中 ,然后如果我将它连接到我们的基色中我们现在将根据我们的菲涅尔进行 lerp 重新看到

边缘反射和中间折射,这是一个非常酷的结果。所以为了调整这个,我将我的菲涅尔项重新连接到基色这样我们就可以看到发生了什么现在我要调整这个叫做 Exponent 的值,我要把它设置为3
你可以看到当我们这样做时 ,我们会在边缘周围得到更多的白色

现在你可以看到我们有一个同时具有反射和折射的模型,非常酷的一件事

对我来说非常重要在这里指出的是,我们在某种程度上违反了我们应该用引擎做什么的规则,一般来说引擎应该提供所有的光照信息,包括反射和折射我们所做的是绕过引擎并提供我们自己的反射 ,所以你可以看到我们已经创建了这个模型它真的适合我们的环境所以如果我们真的想用玻璃创造一些东西,我们会想使用引擎的内置方法来做反射和折射但我在这里向你展示的是一种,你可以创造一些东西的方法这是自定义的东西,不使用引擎的内置反射系统而是使用您自己创建的反射系统,因此您可以创建一个效果,该效果可以执行引擎预期之外的其他事情, 所以这很酷

让我们切换转到 unity 看看我们如何获得相同的效果好的,这里我们在unity中,你们可以看到,我已经构建了一种非常类似的着色器

我在摄影机节点中引入了,我使用摄影机方向,我还引入了法向量节点然后我引入了反射节点,并将我的相机方向传递到输入插座输入套接字,我将我的法线向量传递到法线反射节点的结果是反射向量

因此我创建了一个示例立方体贴图节点,这里是一个示例立方体贴图节点 ,然后我抓取了一个立方体贴图纹理

如果你使用 hdrp,你可以看到 unity 内置了其中的几个hdrp。
所以我将我的反射向量传递到我的示例立方体贴图的方向插槽中现在我有了一个反射,然后我可以将它传递到我的基色中,所以 这就是反射的工作方式

折射怎么样?
在unity中,如果我在这里输入折射,我得到的是角膜折射的东西,但这不是我要找的我需要计算折射向量的东西实际上我没有这样做的节点我怎么能计算Unity的折射我可以使用自定义代码节点。
所以让我们输入 custom 在这里Unity允许我创建一个自定义函数
所以让我们继续这样做我将在这里打开我的图形检查器
我需要创建一个几个输入它是一个浮点三

我要为我的法线创建一个输入它也是一个向量三 ,然后我知道我也需要一个叫做eta或折射率的值,所以我要我要调用这个 eta然后对于输出,我需要一个向量 3它是折射向量 ,所以现在我需要代码和而不是使用文件

我只是要在这里输入一个字符串,作为我函数的名称我将称之为折射。然后我要说我的输出需要命名为 refract所以对于我的代码,我要键入 refract equals 然后我要调用称为折射的 hlsl 内在函数。非常简单hlsl 内在函数采用我在此处创建的相机矢量,作为输入相机矢量并采用我在此处创建的法线输入,法线它还采用虚幻中的eta 值。我的输入需要空气的反射折射率为 1,它需要玻璃的折射率为 1.52,eta是空气的折射率1,除以玻璃的折射率所以我可以通过预先计算得到好的,这是我的折射函数,这将创建折射就像在unity中内置了一个折射节点 ,但我能够创建一个这样的节点

好的,我将把我的相机向量传递给它,我将传递我的法向量给它现在我需要一个eta 值,所以我要打开我的计算器,要打开我的计算器我要把空气的值除以glass并获得 0.65的值,所以我只是将这个粘贴复制到我的 eta 中 ,现在我有了一个折射向量,所以让我们用它来计算我们的折射

好酷,就像我们现在在虚幻中一样正在通过我们的物体表面折射 ,如果我们想像在虚幻中那样做我们可以对立方体贴图采样两次,一次用于折射,一次用于反射然后我们可以使用 lerp 节点在两者之间进行混合使用lerp节点和Fresnel Effect

所以白色的地方我们想要反射黑色的地方我们想要折射,现在我们可以把它连接成颜色现在我们有一个很好的近似玻璃物体 ,边缘有反射中间有折射

我希望你很喜欢这个教程,并且您了解了反射和折射并且引擎会自动执行这些操作, 但是如果您想在材料中实现引擎没有给您的效果,您可以像这样自己手动执行这些操作非常感谢大家的收看,我真的希望这是有帮助的请务必在下周回来观看更多的着色器教程
好的,大家都有一个美好的一周和一段美好的时光下期见


原帖地址:什么是反射和折射向量?如何使用?创建自定义效果超引擎效果!【Ben图形/24】 (qq.com)



本帖被以下画板推荐:

微信公众号:Game艺视界
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表