什么是向量?在UE 5 和 Unity 中使用输入向量注意那些事项【Ben图形/04】...
教程向量Game艺视界原创 15024 0
实名

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

发布于 2022-3-21 20:49:10

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

x
本期内容
今天我们将讨论输入向量在我们开始在虚幻 5 和 Unity 中使用输入向量之前我想退一步谈谈 核心概念说明一下这些原则,这样你就会明白发生了什么.
首先重要的是要了解什么是向量,向量基本上是两点之间的一条线它有起点和终点。我们用向量来找出场景重要的图形信息,比如物体离相机多远或表面面向的方向,以及物体是否应该 被光源照亮。

今天我们将讨论三个主要向量,第一个是表面法线、表面法线或通常称为法线是存储在模型每个顶点的向量,法线指向的方向是表面面向的方向,因此法线是永久的特定于表面,现在我知道这里只显示了其中一个, 但重要的是要知道模型表面上的每个点都有自己的法线。表面法线是由您用来创建模型的 3d 软件自动创建的法线总是一个单位长,这很重要因为很多数学像点积这样的许多数学运算要求向量的长度相同。
您可以使用法线来判断模型表面与其他对象之间的关系,像相机或灯光这样的场景


7899038bd0dc5e93958dba0e2f887ad4.png


接下来让我们谈谈相机矢量这有时也称为视图矢量或眼睛矢量。它是一条线,从场景中相机的位置开始,并延伸到场景中的每个点如果我们测量相机矢量的长度,它告诉我们场景中的每个点离相机有多远,所以它给了我们场景的深度如果我们将相机矢量与模型上的表面法线进行比较,它会告诉我们模型的哪些部分面向相机,哪些部分背对着我们需要对相机矢量进行归一化,这意味着我们将其设为一个长度单位就像表面法线一样, 一旦我们有了归一化的相机矢量,我们就可以在相机矢量和表面法线之间做点积, 如果表面面向相机,则结果为 1 或白色值,0或者是一个黑色的值,如果它背对着摄像机或者垂直于摄像机。

2cb737ffbba30463f30ed792dedd472c.png


最后我们就有了光矢量,如果它是定向光 ,光矢量的方向是一个常数值, 但是如果是点光源,那么光向量从光源的位置开始,然后到达当前正在渲染的点,就像相机向量一样,我们可以测量用光矢量的长度来判断光的距离,我们可以比较光向量和表面法线之间的角度,以查看 表面应该从光接收多少照明, 因为大多数现代渲染引擎包括 unreal 和 unity 使用延迟渲染照明,计算通常在渲染过程的后期完成,因此您根本不需要在使用着色器图形或材质编辑器制作的材质中使用太多光向量,,但现在了解它们的情况仍然很好我们已经完成了所有的解释

让我们来看看一些示例 着色器,并展示您可以对表面法线、相机矢量和光矢量做些什么,虚幻中,这是我们将要介绍的第一个示例看看是你可以只用表面法线做的事情,

所以在虚幻中,我在世界空间中有顶点法线,所以我可以通过在此处输入顶点然后选择顶点正常的ws来得到它,当你这样做的时候,这是非常重要的。

用两个向量进行运算,它们都在同一个空间所以我得到了顶点法向量。当我们一起使用它们时,我们需要在同一个空间中使用它们,在世界空间中有顶点法向量还有另一个向量,在世界空间中直接向上指向的向量,所以我有0 0和 1,这在世界空间中直接向上指向因为在虚幻中向上是 z 分量,所以我有 0 0 然后1 作为 z 所以这是向上的,我正在我的表面法线和向上向量之间做,这将比较世界空间中的向上向量和我的模型的表面法线

如果法线是平行或指向同一方向,它会给我白色,如果法线垂直,它会给我黑色,然后我使结果饱和,我们将把它传递给基色和自发光来看看会发生什么,

所以在这里你可以看到我使用了表面法线、点积与向上向量一起做这给我的 是一个面具,
其中我的模型朝上的部分是白色的,而我的模型的部分是面朝下是黑色,有很好的平滑下降,

现在我可以用一些额外的数学来调整它,如果我想改变这种下降的锐度或类似的东西但这真的很有用, 我可以使用表面法线来判断一个表面是否朝上,如果我想在模型顶部涂抹沙子或苔藓,我可以将这个面具用于各种事物,将材料应用到 模型的顶部。
使用mask通道也可以实现一样的效果可以不用点积节点非常酷,这是顶点法线的一种用途,

顶点法向量,还有很多其他我可以做的如果我想的话,我可以遮住上面的向量。我可以用y,现在我有一个来自侧面的质量

或者我可以使用x现在我 前面有一个面具,所以这是我们的第一个例子

我们实际上将同时使用顶点法线和相机矢量, 所以让我们看看这个例子。我们有我们的相机矢量,相机到表面,这里我们有顶点法线我们正在这两个向量之间做点积,现在点积是白色的。当这两个向量平行时,点积将是白色的, 它将是黑色的当它们垂直时,当表面指向相机时, 我们将得到一个白色值,当它远离相机时, 我们将得到一个黑色值,所以你可以看到我们的模型在中间是白色的,然后在边缘是黑色的。


关于虚幻的工作原理
每当您在两个向量之间进行点积时,它们需要具有相同的长度。这就是为什么我们有归一化,所以我们取顶点法线,我们让它的长度为 1,然后我们取相机向量,我们将它的长度设为1。然后当我们做点积时,我们得到了我们现在期望的结果。关于这个相机矢量的事情是它已经标准化了(Normalize)所以如果我将它传递到这将它插入这个点积,你会看到我们得到相同的结果。所以这个相机矢量进来我之前,告诉过你相机矢量从相机到当前正在渲染的模型上的位置,但在虚幻中,摄像机矢量的此节点已经标准化,因此它不是从摄像机到当前正在渲染的模型上的位置的全长, 它只是标准化版本所以我们可以摆脱这样的操作,我们在顶点法线和相机向量之间做点积而不做归一化, 因为归一化已经应用于这两个节点,如果我们想要的话调整我们的遮罩,我可以在这里使用一个电源节点,就像我在此处将其提高到 3 的幂一样,所以如果我们现在将其插入,

您会看到我的边缘变得更黑了,值越大黑色越靠近中间。

我也可以使用一个减号节点,得到相反结果,所以第二个例子是 在相机矢量

这样相机矢量点积就可以与表面法线给我们一个面具,告诉我们表面是否面对着摄像机或背对着相机。

下面是第三个例子:
实现的效果是当物体靠近相机时为黑色, 当物体远离时为白色,现在这种效果有很多用途例如。如果我想在模型靠近相机的时候应用雨滴,但当模型离得更远的时候淡出那些雨滴,我也可以在这个例子中这样做,如果我想在我的表面添加一个细节纹理但是当模型离模型越来越远的时候纹理会逐渐淡出,(详见第九节课视频15:00分讲解节点工作原理)
最终下图效果

虚幻中的一个节点称为光矢量节点在这里我用光矢量节点 和顶点法线做了点积,我要做的是告诉你们平行和垂直是怎样的模型的表面与光的平行或垂直程度

可以看到它说光向量只能用于光函数或延迟贴花材料,我们不希望你在你的材料中做光照计算基本上这是漫射光照,

我真的不需要做漫射光照,断开节点开启光照模式引擎为我做好了, 这发生在渲染后期的 g 缓冲区中,而不是我在这里定义材质时所做的,因此 即使有光矢量节点可用您也只能 在某些条件下使用它。

现在让我们切换到 unity 并 看看那里的示例,我们将看看这三个相同的示例,但我想向您展示一些差异有几个关键差异和 unreal 略有不同, 所以在我们的第一个例子中,我们采用表面法线,我们使用分割节点来隔离表面法线的 g 或 y 分量 ,然后我们饱和如果我们将它插入到我们的着色器中, 我们将看到与我们在虚幻中获得的面罩相同,所以我们取法线的 y 分量,然后将其传递进去。
如果我打开我的分割节点split, 你可以看到我正在使用与 y 相同的 g 分量, 而在虚幻中我正在使用z 那是因为在 unreal 中,使用 z 的向上向量,并且unity中y向上,所以我们将这个东西翻转过来,我们用y轴作为上向量而不是用z轴作为上向量,这是做同样事情的两种不同的方法。只是在不同的引擎中是不同的, 所以当你用unity时,确保你使用y,这是我们使用的法向量来创建面具,就像我们在虚幻的你知道你可以使用其他组件创建一个前面罩或左右面具。

这里的一个区别是我想指出我在法线和相机方向节点之间做点积,所以这里我有我的相机节点它有所有不同的相机参数,我的相机方向从这里出来,但是一个unreal 和 unity 之间的区别在于,unity 这个相机方向是反转的,所以如果我想在表面法线和相机矢量之间做点积并得到 菲涅尔项,我实际上必须在这里添加一个否定节点(Negate)反转相机矢量的方向向量,以便能够执行此操作,所以这是我的法线、我的表面法线我的相机矢量被否定了。并且我有我的点积,所以如果我将此结果传递到根或我的主堆栈中

你可以看到现在我在中间有白色模型正看着相机 ,然后它在边缘周围变成黑色 ,我知道这不是很明显这就是我在这里添加这个电源节点 的原因增加对比度(power),
可以使用一减节点来反转结果并在边缘获得白色,

对于我们的最后一个 例子,我做了同样的事情在这里, 我们在虚幻中做的,我从摄像机投射出光线或向量到模型上的位置所以我用摄像机减去模型的位置,然后我测量我用这个操作投射的那条光线的长度,然后我在这里做从相机位置偏移的减法 ,我也在做除法来确定 那个面具将会有多远,所以这会给我 一个面具,它从靠近相机的黑色开始 然后淡出到白色我得到的距离相机越远,所以这里的这个值以米(9.5)为单位,所以这意味着 我将从相机高达 9.5 米的点开始然后从该点到0. 7 米 后,我将从黑色渐变为白色,
从世界空间位置减去相机位置 然后测量长度我们离相机多远然后我们可以调整蒙版 正是我们想要的用这个 9.5 值开始与相机的距离,然后除以 我们希望我们的蒙版的长度,这样蒙版 就从场景中我们希望它开始的位置开始然后 在场景中我们希望它结束的地方

我们在unity中获得了相同的效果 ,这是使用法线矢量和相机矢量的一个很好的基本总结。




本帖被以下画板推荐:

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

本版积分规则

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