您需要 登录 才可以下载或查看,没有账号?注册
x
本期内容 在这个视频中我们将把通道打包提升到一个新的水平让我们开始 在这段视频中,我假设你已经知道如何做到这一点,如果你不知道基本知识,我已经在描述中链接了一个很棒的视频系列,所以请先看一下这些视频使用标准频道打包,我们最终得到一组三种纹理
看起来像这样,我们有我们的颜色纹理,我们的法线贴图和一个带有三个或四个蒙版的蒙版纹理这非常有效,我们只有三个纹理因为七张贴图都打包了。所以这里我们有我们的颜色纹理和可选的不透明度,我们有我们的法线贴图和 xyz 我们没有使用法线贴图的 alpha 通道。然后在我们的地图中,我们的蒙版当然我们有环境遮挡,我们的平滑度或粗糙度取决于我们使用的引擎。我们有我们的金属面具我们有我们的高度,所以这是一种非常典型的打包纹理的方式,这个方案几乎涵盖了所有类型的3d资产
但如果我告诉你我们可以将这三个纹理方案简化为某些类型资产的两个纹理,让我们看看我们如何做到这一点,对于我们不需要的许多资产不透明度纹理,在法线贴图中可以仅使用 x 和 y 数据存储法线,而不使用z数据我们稍后可以根据 x 和 y 计算 z 数据然后我们也不使用alpha通道。现在也在某些类型的资产中,例如树叶和植被地形和岩石我们不需要金属遮罩。因此如果我们将这种蓝色纹理存储为黑色,我们也会浪费该通道。然后浪费很多资产类型如树叶和岩石我们不需要高度图 所以如果我们看看这里有什么,我们有三个纹理总共有12个通道,但我们只使用了其中的七个,五个它们没有使用,所以这里几乎有一半的通道没有使用,所以我们需要做的是稍微重新调整一下,这样我们就可以将它从三个纹理减少到两个
所以让我们来看看它是如何实现的,可以这样做这是我们的高级通道打包方案 我们有颜色纹理在alpha通道中我们将放置平滑度或粗糙度数据 然后我们有了法线贴图注意现在我们只存储 x 和 y ,正常但在蓝色通道中我们有我们的环境遮挡或我们的不透明度贴图,然后在 alpha 通道中我们现在有我们的高度,在某些情况下我们不需要高度,所以存储这个值是可选的,允许我们做的是在我们的法线贴图的蓝色和alpha通道中屏蔽纹理,还有我们颜色纹理的alpha通道 所以对于某些类型的资源,我们已经能够消除我们的第三个贴图,并将其减少到两个纹理,所以现在我们使用更少的内存减少纹理样本,如果减少使用的资源量并使着色器尽可能快地执行非常重要,那么应该使用此技术如果您总是对所有资产类型使用三种纹理方法,那么您会在表面上留下内存和性能,我认为制作适合每种资产类型需求的独特纹理打包方案是值得的,而不是仅对所有内容使用一种通用技术,所以接下来我需要做的就是向您展示如何处理法线贴图,因为一旦您将其他数据放入法线贴图的某些通道中,你就不能再告诉引擎它是法线贴图,如果你这样做,那么引擎在引擎盖下处理法线贴图的事情就不再这样做了,你必须自己做,(修改法线贴图引擎不能识别并处理法线贴图应该起到的作用,需要我们手动处理)所以下一步我将向你展示如何去做,以及如何去做从x和y分量自动计算出法线的z分量
好了,我们回到了虚幻状态。你可以看到我有我的标准三个纹理包装方案,我有我的基础颜色纹理它插入基色、我有我的法线贴图它插入法线,我有我的蒙版贴图你可以看到我的红色通道被插入到环境遮挡中,我的绿色通道被插入到粗糙度中,我已经在蓝色通道中获得了我的金属度,并且在alpha中获得了我的高度。但显然我不需要将其插入根部所以这就是我们通常使用这三个单独通道的纹理对象的方式这非常有效,就像我说的我们只使用三个纹理,但在某些情况下我们可以更进一步我们可以减少到两个。
所以在这里我已经创建了这两个纹理,我现在要做的是向您展示这两个纹理如何只是一个与这三个略有不同
首先我在这里有我的颜色纹理,如果我们看一下纹理您可以看到在 alpha通道中我有粗糙度贴图存储在这里,并将粗糙度贴图存储在alpha中,颜色通道意味着我不必将它存储在额外的第三个蒙版纹理中
现在让我们看看我的法线贴图,在这种情况下我将法线贴图称为noh,这意味着红色和绿色,我有蓝色法线的 x 和 y 我有AO在 alpha 通道中我有高度。所以让我们看看它所以这是我的 x和我的 y 法线,这是我的环境遮挡在蓝色 这是我现在存储在 alpha 通道中的高度数据
这里需要注意的重要一点是,如果我们查看标准法线贴图的标准是我们将压缩设置设置为法线贴图
但对于 noh 纹理我们无法将其保存为法线贴图,因为它具有使用它存储的额外数据。所以我将压缩设置设置为bc7,而现在法线贴图总是在srgb设置为关闭的情况下存储,因此请确保在引入此纹理时关闭 srgb 并将压缩设置设置为bc7 。您可能想将其设置为法线贴图,但如果这样做您将丢失其他通道中的一些数据,因此您要将压缩设置设置为 bc7 并将 srgb 设置为关闭
所以如果我们回到这里,对于我们的着色器您会注意到,当我们引入调整后的法在预览中看起来与正常法线贴图不同 原因是这个(右侧)纹理样本,因为我们已将其设置为法线贴图unreal和unity是自动显示,在幕后做一些事情将这些数据从纹理更改为向量以及它的工作方式。(右侧法线)这是在做的是数据存储在零到一的范围内,向量存储在负一到一的范围内。所以当你告诉纹理它是法线贴图时引擎会自动为你扩展该范围 但因为我们没有在这个纹理中完成 。它不会自动扩展,所以我们必须自己做,我们需要做的另一件事是计算我们的法线的 z 分量,因为在这种情况下我们已经将遮挡存储在我们的蓝色通道而不是 z 分量 让我们快速看一下。这是我的常规法线贴图在蓝色通道中z数据
但在我的noh贴图中,如果我们看一下这是我们现在的遮挡数据其中两个看起来相似但并不完全相同,这是我们的环境遮挡,这就是我们的 z 数据的样子(上图)
所以我们需要做的是根据 x 和 y 做一些数学运算来计算这个 z 数据 这些是我们将在这里使用的节点,我已经设置好了我要做的是,把我的x和y取正常值,然后就像我之前说的那样,我将通过乘以2然后减去1来扩展它们,所以一旦我这样做了您就可以看到我的原始数据看起来像这样有点像增加它的对比度,但它迫使一些数据进入负范围所以我将范围从零扩展到 1 到负 1 比 1。好吧我的 x 和 y的范围扩大了
现在我需要做的下一件事就是将 x 和 y 乘以它们自己所以我取 x 和 y你可以看到我得到了我已经把它插入 a 和 b,所以我基本上是对我的 x 和 我的y进行平方,然后我拿我的 x 数据我做一个1减去那个然后我拿我的y数据,然后我减去它 x 然后我找到结果的平方根最终结果看起来像这样,然后这就是我原来的 z 数据。好吧!我可以通过将它平方然后减去 1 减去看到 x 并从 y 中减去它来计算它,然后我得到我的结果。 所以这很简单,这就是你必须做的所有数学运算来转换 x 和 y 一个法线到 xy 和 z 然后我在这里附加原始 x 和 y 所以,现在这个附加的结果是我的法线的 xy 和 z 如果你现在看我们的预览
我们的数据看起来就像我们原来的法线贴图,好像我已经将 x 和 y 和 z 存储在一起了,所以让我们看看现在的差异,我已经将我的三个通道数据或我的三个纹理数据插入根目录,我只是要暂时删除这个连接,所以可以看到这些法线是什么样子,我的三个通道数据或我的三个纹理数据插入根目录,我只是要暂时删除这个连接,所以可以看到这些法线是什么样子如果我插入这个计算出的法线贴图,你会看到结果完全一样。所以我能够把这个正常的,我存储在三个通道中,然后只存储在两个通道中
我希望你喜欢这个技巧,所以让我们替换我们的三个通道,我已经替换我现在得到完全相同的结果。
我想花一点时间向您展示,并警告您不要这样做。所以如果您看到它您就会明白为什么会发生这种情况, 我要去切换到我们的NOH法线贴图纹理,并打开红色绿色和蓝色通道我只是要放大这里让我们放大到 400%我只想看看这里在右下角,所以让我们看看像这样的法线贴图
当我要切换到我的常规法线贴图时,我只是使用法线贴图压缩存储传统方式 我们将使用法线贴图压缩放大到 400如果你在这里看看我的纹理它看起来几乎就像我在未压缩的情况下存储它一样,数据是完全平滑的
但是如果我看看我的noh 版本,你会注意到什么我不确定这是否会遇到使用 youtube 压缩等你可能会注意到,它们有一点,它们是一点块状的人工制品在这里,你能看到一点块状 让我们切换到蓝色通道让我们看看我是否能找到三个通道中的一个,可能显示出更多的块状是的,也许这个红色通道,你能看到它看起来像是有一点网格在这里发生
因为当我们使用bc7时,纹理压缩会影响我们的法线,当我们告诉引擎我们正在将其压缩为法线贴图时 它会使用专门为法线设计的压缩方案
但是当我们不使用它时 我们只是使用 bc7而不是法线贴图压缩方案,我们的法线会受到一点影响质量会有所损失。因此使用这两种纹理打包技术的诀窍是知道,质量有些丢失并不重要方案一、要求质量方案2
让我给你一些例子植被和树叶因为你的法线不需要精确,你看到的植被和树叶的主要内容是 不透明切口为您提供的非常有趣的形状。因此树叶和植被是使用两种(打包两张图)纹理包装方案的好机会,另一个机会是使用岩石,岩石使用两个纹理因为法线不需要那么精确,它们大多只是嘈杂而且很可能你会在基本法线之上有一个细节法线,无论如何这会给你大部分细节和可以存储为法线贴图。 因此您在另一个示例中看不到质量损失我很久以前已经在之前的视频中展示了这一点是关于地形纹理的地形纹理。这非常重要我们尽可能少地使用纹理样本,尽可能多使用这种技术也是一个好主意。第一因为它会节省性能因为你已经在你的地形上采样了很多纹理,第二因为很多时候地形被掩盖了由草和杂草和小石头和东西的细节网格,所以你不会注意到地形上的细节现在有几种情况 使用三纹理填充方案会更好,特别是在像你的角色脸这样的情况下,例如,你需要非常精确的法线贴图,这对于使用或不使用额外的压缩或额外的填充非常重要,我们使用这些压缩或额外的填充将事情简化为两个纹理。另一个例子是硬表面机械对象,其中法线贴图的精度非常重要,在这种情况下,您将看到法线贴图的问题或质量损失,是您使用此打包方案,在法线贴图中放入其他数据
我还想展示一件事我们在这里做一点数学计算,将x和z相乘,得到x和y,然后进行减法运算和平方根运算,有一个节点实际完成了所有这一切,它被称为导出法线z,所以我要获取导出法线z节点
现在我可以将 x 和 y 乘以二减一然后将其直接插入派生法线z,然后将其插入我的法线现在您可以看到我使用此节点获得的结果,与我使用所有这些获得的结果相同。因此如果您想要更清晰的着色器请继续并使用派生法线Z
并且您不需要像这样使用这些节点,但对我来说重要的是向您展示这个数学是如何继续并从x和y计算法线的Z分量这就是这个节点所做的
所以我将继续删除这些(上图省略那些节点)现在我有 一个漂亮干净的着色器我正在将存储在我的红色和绿色通道中的这个 x 和 y 数据转换为完全正常的
让我们跳到 unity 我将向您展示如何在 unity 中做同样的事情,我有我带来的相同的三个纹理 我有我的颜色纹理,我的法线贴图和我的蒙版贴图,你可以看到我已经将所有这些插入到主堆栈中,我也有版本仅使用两种纹理的材料的例子。我有我的颜色和粗糙度在这种情况下我需要 将它作为颜色和平滑度引入因为 unity 使用平滑度代替,我也有我的正常遮挡和高度纹理所以在这种情况下我需要解压缩我的正常遮挡高度纹理,以根据我的 x 和我的 y 数据,创建我的正确法线
所以我要在这里打开这个节点,并从这里到底部我要把我的 rgba 纹理插入到这个swizzle节点只是正在使用 rgba 并且只隔离 x 和 y分量只是前两个通道。所以你会注意到它从粉红色矢量四或四通道数据)变为绿色,这是现在有两个通道 我需要将这些数据从零扩展到一到负一到一的范围,并且unity我可以使用这个称为remap 的节点,所以我要做的是告诉它进来的数据 从零开始到一个范围,我想 exp 并且它是负一比一的范围。所以在虚幻中为了做到这一点我使用乘以二然后减一但是在unity中我有这个方便的节点称为重新映射,它基本上做同样的事情但我可以告诉它是我的起始范围和我的结束范围,然后就像在虚幻中我们使用派生法线 z 节点 unity 有这个节点称为法线重建 z ,我们在其中插入我们扩展的 x 和 y数据。它给我们的结果是 xy 和 z 数据 就像我们在虚幻中所做的那样我们手动计算 z 这个节点。正在计算z并创建我们的法线
所以现在你可以看到我们创建的法线看起来和我们得到的法线完全一样。如果我们一直有那个 z 数据所以我可以继续并插入所有这些,所以现在我得到一个看起来像这样的预览结果我会继续在这里插入我的法线数据来替换它
我会将其他贴图分别插入主材质所以现在就像我在虚幻中所做的那样。我已经用两种纹理方案取代了我们的三种纹理方案,很好所以今天我们的视频结束了。
我希望你喜欢它,并且你知道可以更有效地打包东西这是一个非常酷的技术。你可以减少在特定情况下例如树叶岩石地形您的纹理内存和纹理样本从三个减少到两个,可能还有其他一些情况你不想在需要精确法线的地方使用它,但如果你不需要,你可以通过将东西打包成两种纹理而不是三种纹理来节省性能和内存。 好的,大家都有一个美好的一周和一段美好的时光下期见。
|