您需要 登录 才可以下载或查看,没有账号?注册
x
本期内容今天我将向您展示如何在着色器中使用位置节点的几个示例
让我们在这里讨论位置我们在unity的着色器图中我在这里有两个节点,它们都将位置数据带入我们的场景 首先我将讨论这个位置数据,表示位置的 x y 和 z 值 。如果我们将位置节点插入主堆栈的顶点部分, 我们可以首先获取各种元素的位置数据,重新获取模型每个顶点的位置数据,因此我们的模型由三角形组成,一个三角形具有三个顶点或点,因此如果我在主堆栈的顶点部分使用该位置则会引入以下位置,如果我将我的位置节点插入我的主堆栈的片段部分,那些顶点我实际上得到了模型位置数据的每个单独像素的位置,只是代表位置的数字
但我们可以将位置数据插入到我们的主堆栈的基色或发光部分,那么将数字作为颜色, 这样您现在就可以在我的预览中看到我的位置数据表示为颜色,x 表示为红色,y 表示为绿色,蓝色代表 z 数据 ,您可以看到它从黑色变为彩色,因为数据从球体这一侧的负数变为x 的正数。并且在 y 轴上我从负数开始球体底部的下方变为球体顶部的正上方
因此如果我们将球体放入测试场景中,您可以看到颜色也在我的球体上, 这个操纵器向您展示了一种方便的方法可视化它,你可以看到 x 轴在我的操纵器上表示为红色,y 轴表示为绿色,z 轴表示为蓝色 ,我们可以在我的球体上看到相同的颜色。因为现在我映射是位置数据,作为颜色通过着色器显示到我的对象上
如果我移动我的对象,您可以看到球体上的颜色保持不变
如果我们在这里切换回我们的着色器,您可以看到我的位置当前设置为对象空间 ,这意味着它是相对于对象本身的,所以无论物体在场景中走到哪里位置数据都会随之而来
让我们看一下将位置数据从对象空间切换到绝对世界空间保存着色器我们在移动
您可以看到当球体远离中心时颜色是实际上在变化, 因为数据是相对于我的世界中心而不是我的球体的中心,所以你可以看到我必须为了看到这些颜色让它们相对靠近世界的中心
旋转不会改变颜色
如果我使用世界空间中的数据旋转我的对象,则颜色数据保持完整,因为它是相对于世界的,它不关心我的对象的旋转,所以我正在旋转我所有的我旋转我的球体,但我的颜色保持完全相同,那是因为它们代表了世界中的位置而不是物体的位置,所以它们不再与物体的旋转有关好吧这真的很有趣
为我们的对象提供了一些位置数据,我们可以在对象空间或世界空间中表示这些数据, 但是我们可以用它做什么,让我们来看看 我们可以使用这些位置数据的几个例子在第一个例子中,我们将看看我们正在创建一些风格化的外观,有很多艺术家喜欢创建模型在模型底部使模型变暗 ,然后当我们向上模型和更高时,我们变得越来越亮这对角色来说非常好,尤是风格化的角色我们会变暗,这样你的注意力就会集中在角色的头部或面部,所以让我们看看如何使用对象空间位置来做到这一点, 所以这里我有我的位置节点
然后将其设置为对象空间我使用我的 swizzle 节点来隔离 y轴或位置数据的 y,这基本上将我的位置数据变成了一个非常好的渐变,从底部的黑暗到顶部的明亮并记住它相对于任何地方枢轴,枢轴点在球体的中心所以现在我有从中心向上的正数据,而我有从球体的中心向下到球体的负数据底部为了稍微移动这些值
我需要乘以扩大或缩小范围, 所以我将乘以 0.6使范围缩小一点
然后我要加上 0.5 这将向下移动范围,所以在这里你可以看到我的支点在中心但是因为我添加了 0.5 我已经将它移到底部
现在我要调整数据为了增加对比度我要提高它是 2 的幂, 所以我们可以看看发生了什么,我想交互式地调整这个数据
如果我将它设置为添加零我现在只是要关闭这个电源节点,因为它是要做 一些奇怪的事情你可以看看我是否添加了 0 我的支点在中间
但是当我增加这个值时我将支点 向下推向球体的底部,我可以将它设置为喜欢任何东西,我希望它在我的情况下我只是将它设置为 0.5然后就像我说的我要把它提高到 2 的幂
现在让我们把这个数据插入我们的颜色和我们的自发光中,然后取一个再次查看我们场景中的结果,您可以在这里看到我们模型的效果,底部较暗,顶部较亮, 因此如果我在这里有一个不错的角色,我会很友善模拟一点点环境遮挡,例如真正广泛的环境遮挡,因为角色会很暗在底部 ,在右上角是亮的所以这是在我的着色器中使用位置数据。为我的角色添加渐变的一种方法, 这样它的底部和顶部都是暗的
让我们看看另一个例子:我们想要做的是我们在环境中放置岩石或树木 ,我们希望这些岩石或树木或任何这些我们放置在环境中的实例对象,我们希望它们的颜色略有不同具体取决于他们的位置,所以现在让我们看一下这个例子在我们看这个例子之前,我想向你展示一种不同的位置那是物体的位置
让我们回到这里到顶部,你可以看到我有两个节点在这里。我有位置我有位置节点并且我有对象节点, 位置从它出来这可能有点混乱, 因为我在这里有位置,我可以把它放在对象空间,然后我也有地位对象和那些是两个非常不同的东西所以让我们看一看
让我解释一下这里发生了什么,所以对象空间中的位置意味着顶点的数据是相对于对象的枢轴的像素,但是对象本身意味着我没有为每个像素或对象的每个顶点获取数据,我正在获取对象本身的数据,关于对象数据的有趣之处在于它对于每个像素和每个顶点都完全相同整个对象,让我们继续将这些数据插入通过基色和自发光来看。 在场景中完全是黑色的原因是因为它正好位于中心 ,这意味着当我移动我的对象时它得到的值将是 0 0 0 你可以看到你会看到当我在 z 方向移动它时,它会变成蓝色和当我沿 x 方向移动它时它会变成红色,当我沿 y 方向移动它时它会变成绿色
你可以看到它接收到的颜色是均匀的,因为我们正在传递对象的位置对于我们将数据添加到的每个顶点或每个像素,它不是球体上每个点的位置而是整个球体本身的位置这很有用因为,这对于示例的确切原因很有用。所以让我们下来看看我们有什么,所以这是我的对象位置 我将它传入然后乘以三 ,然后我把它分成它组件所以我把它分成了 rg 和 b 或 x位置y 位置和 z 位置我在这里做的是我将所有三个加在一起
所以这会给我的是 x 加 y 加上z,然后我将它传递给正弦波这将给我一个介于负一和一值之间的波形,但我希望两者之间的值介于 1 和 1 之间,因此介于 1 和 1 之间我正在使用重新映射节点并将我的输入映射设置为负一对一,并将输出映射设置为从零到一
所以这会给我们什么,我将继续并将其插入自发光和我的主堆栈的基色 ,让我们看看我们将得到什么以便当我在场景中移动我的场景或我的球体时,您将看到的内容取决于对象在场景中的位置。现在得到一些介于零和一之间的值。根据位置我得到了一些不同的值使用它作为遮罩
在我的场景中我可以使用一个lerp节点,我可以将它传递到我的lerp节点的t套接字中,现在我可以混合两种不同的颜色或两种不同的纹理或我想要的任何东西 因此取决于我将对象放置在场景中的位置。它将根据其位置获得不同的值,这将允许我让我放置的这个对象的每个实例看起来,与我放置在它旁边或稍微远一点的完全相同的实例略有不同。所以我可以使用这种技术来改变所有的外观同一个对象的实例,所以即使这些对象是同一个模型 ,我应用到它们的着色器看起来也会不同,这取决于我在场景中放置它的位置所以这是一个很好的分解你的技术场景,允许你的环境艺术家一遍又一遍地使用相同的模型,但让它看起来略有不同,你可以使用许多不同的技术来改变它,就像我说的你可以混合两种不同的纹理或者你可以混合两种不同的颜色或两种不同的平滑度,你可以做各种各样的事情
我们看看最后一个例子在这个例子中使用我们的位置数据将纹理实际投影到我们的模型上,所以这里我们有我们在对象中的位置空间我们再次使用我们的 swizzle 节点来隔离位置的 x 和 y然后我将该位置 xy 传递到我的纹理采样器中以对纹理进行采样
所以让我们将其插入我们的主堆栈中并看看我们的结果,所以现在我已经使用 x 和 y 将纹理投影到我的模型上我的位置,让我们来看看我们在场景中得到了什么。所以这是花瓶纹理你可以看到当我在它周围移动时这个纹理有点粘在表面
你可以看到它沿着 z 轴,因为我使用的是我的位置数据的 x 和 y,这意味着它沿着 z 轴在这个方向上投影你可以看到,如果我在这里看它的侧面,纹理有点拉伸和它看起来有点奇怪, 但如果我从这个方向看我的球体,纹理看起来确实不错, 你也可以看到因为当我移动我的球体时位置在对象空间中它保持原状,它粘在对象本身上沿着 z 轴
但如果我从这个方向看我的球体,纹理看起来确实不错, 你也可以看到当我移动我的球体时位置在对象空间中它保持原状,当我再次旋转它时,它会粘在物体上
但是如果我现在将我的位置从物体空间切换到绝对世界空间
您可以看到, 如果我旋转我的物体,投影保持在世界中并不重要 ,如果我移动物体并且投影也保持在世界上,但我的模型正在穿过它所以我得到了一个非常有趣的现象,我得到了这个存在于世界中的被投影的纹理我的模型实际上正在穿过那个纹理,并且这是一个非常酷的效果非常好的投影纹理的方式。只使用世界空间位置,假设我想从上到下投影
让我们尝试这样做所以我要切换回我的着色器 ,如果我想从顶部投影它,我知道那是 y 轴,所以我将需要使用 x 和 z 值而不是 x 和 y, 所以如果我们看一下,现在让我们保存它 我们从顶部的场景你可以看到,现在我的纹理是从顶部投影的
所以我可以改变我隔离的三个组件中的哪一个作为我的纹理坐标,它可以改变纹理投影的方向所以这很漂亮酷,我有这里的三个示例,我们研究了使用对象空间中的位置,创建从模型底部到顶部的渐变,我们研究了使用对象位置在世界中改变模型。然后我们还进行了看看使用世界空间中的位置投影纹理
让我们现在在虚幻中看看这三个示例,我将向您展示如何在该引擎中做同样的事情,所以我们在虚幻中, 虚幻处理这些数据与unity略有不同 ,为了引入世界位置,我们有一个专门用于绝对世界位置数据的节点以便引入对象位置数据,我们有另一个称为本地位置的节点,而不是只有一个节点,并且能够选择你想要数据的空间,我们实际上有两个不同的节点而不是称之为对象空间。他们称之为本地空间,所以我有本地位置和绝对位置就像在 unity 中一样,我们也可以引入对象位置
首先,我们来看一个例子我们用从下到上的梯度对模型进行着色这在虚幻中非常相似,所以我有我的本地位置如果你还记得unity是 y 向上,我只屏蔽 b 通道,所以我想使用 y 轴作为我的垂直渐变。但虚幻是 z 向上等等,我想在这里使用 z 轴或蓝色通道作为我的垂直渐变,所以我将采取我的本地位置抓住蓝色通道,然后另一个 unreal 和 unity 之间的另一个区别是单位在 虚幻中的厘米而不是米,所以如果我希望我的我的梯度大约为 1 米,我会将我的厘米值乘以 0.01 ,这将为我提供正确的数据比例,然后就像我在unity中所做的那样我要把它提高到 2 的幂
我会通过现在你可以在我的基色中看到我的位置数据在预览中数据是相对于球体的中心
但是如果我现在看看我的测试场景,你可以看到我有我的球体垂直梯度从底部一直延伸到顶部还有一点在这里有点不同的是我的球体的枢轴点,而不是在球体的中心,而是在球体的底部,并且所以我实际上不必向下调整数据,我可以将其保留在原处,这样就很方便了所以这是我使用本地位置创建从模型底部向上渐变的示例到顶部
好的让我们来看看我们如何在模型的位置中创建变化所以为此我将使用对象空间位置并将其引入就像我在 unity 中所做的那样,我正在乘3然后我拆分组件,红色绿色和蓝色并将它们加在一起,所以我将 x 和 y 添加到结果中,然后将 z 添加到结果中然后我取该值的正弦波然后我调整正弦波使其介于 0 和 1 之间。所以让我们将它传递给我们的基色并查看结果
所以现在我的球体在场景中当我四处移动它时,您可以看到 根据它的位置它将具有不同的值,现在您可能会看到它改变的频率真的很快那是因为统一和虚幻之间的厘米和米之间的差异
所以为了解决这个问题,我必须将我的位置乘以就像我在这里做的0.01 这样位置数据是以米为单位而不是厘米,现在当我移动我的对象时,你可以看到它的值略有不同取决于我将它放置在非常酷的位置,所以我使用对象位置乘以 0.01乘以通过3 将组件加在一起,做一个正弦波然后调整结果,使它们在 0 和 1 之间,而不是负一加一 好吧,对于我们的最后一个示例就像我们在统一中所做的一样,我们将采用看看纹理投影,这在虚幻中有点酷
你可以看到我在这里的预览正在移动因为我移动我的当我在周围移动我的图形窗口时纹理保持在屏幕上的相同位置是一个非常好的预览
它准确地表明了这里发生的事情,所以我将我的绝对世界位置 以米为单位然后屏蔽 x 和 y 让我们来看看我场景中球体上的样子这是我的纹理从顶部投影
我使用世界空间来移动它坐标在世界上保持固定 ,我的球体正在穿过它们, 所以这是一个非常酷的例子
现在你可能想知道,如果我想投射到我的物体上到我的物体上,但我不希望它拉伸,为此我们需要创建一个基于方向的蒙版 ,这是我们下周将要讨论的主题因此请确保您下周回来一周看看如何创建基于方向的蒙版,这样当你做这些世界空间投影时,你就不会拉伸
|