您需要 登录 才可以下载或查看,没有账号?注册
x
本期内容 今天我们将讨论虚幻和统一中着色器中的 swizzle 和通道操作
让我们开始,我想做的第一件事是确保每个人都理解我所说的着色器图中通道操作的意思,通过电线从一个节点流向另一个节点存储在通道中, 它们有时也被称为组件所有数据由一个或多个通道组成如果我们看一下纹理示例节点,最容易看到纹理具有三个或四个通道,它们有红绿色和蓝色。它们还可以选择有一个 alpha 通道我们可以看到,在这个纹理样本节点上,它有 rgba rgb 的输出然后还有红、绿、蓝和alpha,如果我们选择 rgba 输出我们有一个包含三个通道的线
对于纹理坐标节点也是如此,如果我把它拉出来,我有两个分量 u 和 v 的纹理坐标,所以当我们谈论通道操作时,我们正在谈论重新格式化这些数据去掉通道,加入新的通道按照通道的顺序交换等等,我们不改变通道中的任何数据。我们只是改变通道的数量和顺序这就是我今天要向您展示的内容
然后再向您展示,有助于通道操作的各种节点,我想在前面指出三件事第一件事是所有的操作。我今天要向您展示的是完全免费的这意味着它们不需要 GPU 上的任何计算能力,因此您可以执行所需的所有复杂通道操作,并且不会增加或减少时间,它需要图形芯片来运行您的着色器所有这些操作都可以在没有性能损失的情况下完成
但是当您执行数学运算时, 对具有更多通道的数据进行操作的成本会更高所以最好使用通道操纵技术将通道数量减少到只需要的数量,然后再进行计算。我将向您展示一些示例,说明我的意思
当我们在第二节中开始讨论特定节点时我将向您展示一些示例说明我的意思,我在本系列的大部分视频中,展示了虚幻和unity在工作方式上非常相似,它们的节点相似,并且它们的工作方式几乎完全相同,但是对于节点和通道操作,它是不同的虚幻和unity具有非常不同的节点,来完成这项任务所以我将展示两个引擎中的工作原理,并比较和对比它们对于某些频道操作任务,它更容易和不真实,而对于其他人来说unity更容易一旦我们进入它,你就会明白我的意思
第三,我们使用字母表示通道有时我们使用 rgb 和 a 来表示四个通道 ,有时我们使用 xyz 和 w 来表示它们 rgb 和 a 在我们描述颜色时更常见当我们描述法线等其他数据时,xyz 和 w 更常见但两者可以互换使用,我们可以使用 rgba 或xyzw,这意味着完全相同的东西, 所以不要让这混淆你好吧
让我们做我们的第一个任务所以我们将从四通道数据 rgba 开始 ,我们的目标是删除 alpha 通道,所以我们只有三个颜色通道如果你的颜色数据有一个 alpha 通道,但你只想这样做,这是一个非常常见的操作如果我们对所有四个通道进行数学运算,则更改颜色然后在我们做了一些额外的数学运算之后将它们分开
因此首先将它们分开很重要, 我们从一个样本纹理 2d 节点开始,我们的纹理样本和它为我们提供来自纹理的rgba数据,如果我们只想要rgb我们可以使用一个swizzle 节点来实现,该 swizzle是所有通道操作节点中最强大和灵活的,我们今天将使用它,注意unity有所有这个频道类别中的频道操作节点。所以它们真的很容易找到所以我只是要在这里添加一个 swizzle 节点
我在这里有一个用于 rgba 的输入, 它正在进入然后我有一个当前设置的输出成为浮点数 4,然后我在这里有这些字母,我需要做的就是屏蔽 alpha 通道,只需输入我想保留 rg 和 b 的通道的字母。现在请注意我的输出端口已转向黄色代表三通道数据类型。所以使用 swizzle 节点我已经能够成功地采样出alpha通道我在这里的输出只是rgb 正如我之前所说,这些字母可以互换使用,所以我也可以输入xy 和 z 它会给我完全相同的结果。我们在这种情况下只使用 rgb 因为我们正在处理来自我们的纹理的颜色,而且它更清晰一点但结果是一样的好吧!让我们切换并执行同样的事情
所以在虚幻中如果我使用的是纹理样本节点,那真的很简单,因为它有一个专门为 rgb 指定的端口, 所以如果我连接这个端口并输出到其他端口我将只获得前三个 rg 和 b 通道,不会得到alpha所以它很简单,我不需要任何额外的节点来过滤掉 alpha 通道但是如果我碰巧有一个节点,有四个像这样的通道 如果我只想过滤掉前三个,我可以使用像这样的组件掩码节点然后在掩码下来到这里,并确保检查 rg 和 b因为我想要这三个通道只会给我前三个并过滤掉第四个通道或 alpha 通道现在这个组件遮罩节点也非常有用
如果我只想过滤掉一个通道所以让我们这样做, 如果我在这里取消选中 g 和 b框我现在只输出红色通道所以我会得到一个单通道输出 从我的通道掩码这里或者我可以检查 r 和 g 框现在我有两个通道输出,所以我使用这个组件掩码来摆脱一些通道。如果我想的话,只保留我想要的那个例如调整蓝色通道我可以只使用蓝色通道
让我们看看这是如何unity完成的,就像你想象的那样,我可以像以前一样使用我的swizzle 节点,但如果我只想要红色通道,我可以现在输入 r 我的输出端口更改为这种浅蓝色,它是单个通道,或者我可以只输入g 或 b 以便我可以使用 swizzle节点过滤掉或将,多个通道隔离到一个组中, 或者我可以使用它只给我一个非常酷的单个通道
所以在这个例子中我们使用通道遮罩节点来分离出 alpha 通道,然后给我们 rgb 颜色,如果我们想做相反的事情,如果一个节点具有颜色,另一个节点具有单个值或alpha,我们希望将它们组合起来
会怎么样让我们看一下, 所以这里我们有一个三通道颜色,我们有红绿蓝我们还有一个浮点值在这种情况下它是0.2 ,我们想把这两个一起形成一个单一的浮点 float4 值 ,我们可以用这个非常方便的节点来做到这一点称为 append ,所以如果我只是在菜单中输入 append 这里它被称为 append vector 现在我将拥有一个浮点数或具有rgb和a,所以这是将我的前三个值与我的最后一个值相结合现在给我一个四通道值
要记住的重要一点是如果我现在将这个单通道值连接到 a 并将我的 rgb 连接到 b 中我将首先获取我的 alpha 值 ,然后是我的 rg 和 b因此您将东西连接到这个附加节点的顺序是非常重要,所以确保你得到你的值是你希望它们出现的顺序。
这个附加节点很酷,我可以附加两个浮点值就像在前两个通道中放置 uv 坐标,在后两个通道中放置另一组 uv 坐标,我可以这样做就像我把TexCoord[0]放到A中一样,让我们把这个变成TexCoord[1]我将其放入 b ,现在我有一组漂亮的 uv 坐标,因此此附加节点确实是很好
让我们在 unity 中做同样的事情不幸的是 unity 没有像那样非常好的附加节点,所以我们将使用拆分和组合节点,这里是我们的3通道颜色值 0.5 0.2 和 0.1这是我们的通道值 0.2, 这样我就可以将它连接到我的组合节点的 alpha 中,然后我需要使用我的向量 3 节点并使用拆分将其拆分为 rg 和 b 并将把它们连接到rgb输入插座,然后把这个连接到a,所以现在我有一个组合的rgba值,它由我的vector3 值和我的float值组成
因此unity中执行此操作有点复杂, 因为由于缺少附加节点,我必须使用拆分和组合节点但请记住我一开始说的话,即使我在这里使用两个节点所有这些通道操纵操作。所以不管我用我的通道做了多长时间或多少复杂的事情都没有关系,通道它都不需要在gpu上做任何额外的计算时间就像我在这里用向量3和浮点做的一样,我可以用向量2做类似的事情
我们在一个之前的视频 ,我想将法线的 x 和y 与我单独计算的法线的 z 值结合起来,因此为了做到这一点,我可以将向量 2 值拆分为 r 和 g然后连接它们 进入 r 和 g 的 组合然后我可以获取我的单个浮点值并将其连接到 b
但正如我们之前在虚幻中看到的那样,这种事情真的很容易做到,因为我可以将我的向量 2 值附加到我的向量 1 值上我不需要两个,要做到这一点的节点我可以只用一个就可以了
让我们看看最后一个例子在这个例子中如果我想交换通道,例如交易红色和绿色你可能会问,为什么你想要将一个通道与另一个通道交换,但这实际上是一件非常有用的事情 例如交换纹理坐标 u 和 v 通道免费为您提供 90 度旋转, 因此如果我断开此连接,您可以看到我的花瓶纹理是正确的向上
但如果我继续在虚幻中使用这个 swizzle 节点来获取我的 uv 坐标的 x 和 y并交换它们, 现在我已经旋转了我的底座,并且我的 swizzle操作是完全免费的,所以我已经完成了旋转不使用任何数学或我的 gpu 的任何费用,所以这是在虚幻中做的事情真的很有用,你可以用 swizzle 节点来做这个,swizzle的意思只是重新排列通道,这样你就可以看到我在虚幻中的 swizzle 给了我两个选项,我可以接受两个通道的值,我可以交换频道或者我可以接收一个三频道值 xyz并将它们交换到 yxz 但没有办法做xzy 或 yzx 或 zyx 或 zxy 所以如果我想做其中之一
那么我需要做 一些更多的事情复杂,我需要使用拆分组件节点 ,我需要将它们分解为单独的 rg 和 b 值 ,然后我需要使用附加多个节点这将允许我将 rg 和 b插入任何 rg 和 b 输入,所以在这里我已经完成了,我已经采取了 rgb并将其转换为 gbr 所以你可以看到它是如何工作的,然后我可以输出其中的两个三个或四个但这种事情真的很简单
unity让我们在那里交换,我会告诉你为什么这样 Unity 再次拥有这个非常强大非常方便的 swizzle 节点 ,如果我想交换我的组件,我可以输入我希望它们出现的顺序。所以在这里我有 u 和 v 值 ,我已经输入了 yx 交换了顺序就像我们在虚幻中看到的那样,它把我的花瓶旋转了 90 度来做到这一点 所以我可以做 xy
同样我也可以对具有更多值的数据执行此操作, 因此如果我有四个通道数据我可以做zxyw可以做,yzwx 基本上我可以输入的任何东西,我可以按那个顺序重新排列这些频道,所以我爱我unity中的swizzle 节点,我希望虚幻有一个类似于这个的节点,同样我希望unity有一个附加像虚幻这样的向量节点但我们不能拥有所有功能
swizzle节点可以做的另一件事是你可以多次输入字母 ,例如,我可以输入xxx这给了我一个带有单个浮点数的 float3 值所有三个通道中的值或可以输入yzz ,这会给我第一个通道中的绿色和第二个通道中的蓝色,所以我可以用这个swizzle 节点做各种非常花哨的事情 所以我们看了一下重新排列通道的各种例子数据过滤通道添加新通道,并交换这些通道的顺序
我希望你已经能够看到虽然虚幻和unity 在处理事情的方式上有所不同但它们都完成了相同的工作,你可以做这些两种引擎中的通道操作操作几乎相同,在某些情况下,unity更方便而在其他情况下, unreal更方便,但我希望总体而言, 您已经能够了解到在两个引擎中操作通道数据非常简单和直接
|