UE5和Unity中-三平面投影/修改带有方向性材质朝向问题!【Ben图形/29】...
UE材质教程Game艺视界原创 15239 0
实名

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

发布于 2022-3-23 15:34:37

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

x

本期内容
今天我们将对我们的三平面投影着色器进行最后的润色让我们开始
在最后几个视频中,我们一直在创建一个进行三平面投影的着色器,这意味着它将我们的样本投影到 xy 和 z 如果没看过之前视频最好先返回并观看这些视频,因为我们今天将在这些视频的基础上进行构建,如果您还没有看过该系列之前的视频你可能不明白发生了什么。所以上周我们将着色器放到了一个很好的位置,它投射在x、y 和 z 轴上,我们有这些很好的混合区域三个轴正在混合。但是我们可以做一些事情来改进我们的预测并进一步推动它。这就是我们将在今天的视频中做的事情以说明我们将要解决的前两个问题

d43115cd1f7768c26bf2827eb848be0f.png



我要做的首先让我们来到这里我将输入uv,我将使用它uv网格小纹理来说明我们将要遇到的问题


78c26c6d8dff0f69394a3f7067dcfcc7.png


所以我已经将我的鹅卵石纹理换成了这个 uv 网格纹理,我们可以注意到的第一件事是我们的纹理是颠倒的你可以在纹理上看到这些数字这些数字是颠倒的,所以我们需要做的第一件事就是解决这个问题
如果我们看一下两个,我们遇到这个问题两个投影轴 x是从侧面来的,y是从前面来的

所以这里的纹理投影和这里的纹理投影以及反转的轴是垂直轴,所以如果我们看一下这里,我们可以看到我们的绝对世界定位它是我们的b在这两种情况下都是倒置的所以如果我们想解决这个问题,这很容易,我们只需要将b倒置

所以我要在这里采用我们的绝对世界位置我要添加一个乘以节点,然后我将添加一个向量3在这里我们只需要将 b乘以负1但乘以负1会翻转一些东西,所以我们正在翻转在这两种情况下,我们的 b 通道都在这里,所以我只是将我们的世界位置乘以(1,1,-1)一旦我们连接它现在你可以看到,因为我们已经翻转了我们的 x 投影的第二个分量我们的 y 投影现在我们的数字不再颠倒了

如果我们再次查看这里的数字接下来会发生什么,你可以看到这边的数字看起来是正确的,但是如果我绕到球体的另一边数字是倒置的,有一个非常明显的答案那就是我们在两边都使用相同的投影在一侧我们的多边形朝向一个方向,但在另一侧它们朝向相反的方向,但是因为我们是直接通过它得到的表面进行投影在两侧投影相同,如果我们希望我们的数字在一侧和另一侧正确读取,我们需要选择一侧并翻转我们的水平轴,那么我们如何才能做到这一点呢?


要求我们使用一个我不知道我之前是否讨论过的新节点,但它被称为符号而不是正弦符号这个节点的作用是它返回一个零或一个一或一个负数一个取决于输入的符号,所以如果我给正弦节点一个负数作为输入,然后我们可以添加一个乘法并添加一个向量 3,设置(-1,1,1)好吧,现在这个标志数据是准备好帮助我们用于在 x、y和 z 中投影的 uv 坐标

所以现在我们需要做的下一件事是对于我们的三个投影中的每一个,我们需要使用我们的符号信息来反转我们的水平轴 xy 和 z

所以我将取x,我将取 y再取一个z,我们将每一个乘以水平轴,我们要确保不对垂直轴做任何事情,所以我要做的方式是针对每一个我要追加的给他们一个1所以我会为每个添加一个附加向量所以我要加一个到我的xy和z上

好的,现在我需要把这个结果乘以我的 x 投影,我的y投影,我的z投影,所以我要添加一个新的乘法在这里,将它乘以我的 x 符号,乘以我的 y 符号,乘以我的 z 符号

如果我们看一下,我们的球体在这里你可以看到我们的数字在这一边是正确的,如果我们绕到另一边侧它们也正好在这里对于这个轴以及顶部和底部也是一样的所以我的所有三个投影都在相反的一侧翻转,这样无论哪个方向我的数字都可以正确读取

完整节点


我忘了提到的一件事是我们已经完成了所有这些并且涉及到一些数学,你知道有一些我们必须首先做一些额外的乘法运算确保我们的投影是正确的,然后排在第二位确保我们的投影是反转的这取决于我们在球体的哪一侧,如果我们使用这样的纹理这是一个问题,这是一个网格正确投影的值,但是如果我们使用像鹅卵石纹理这样没有明确方向的纹理,我们绝对不需要做所有这些,我们可以将着色器做的简单一些,而不是做这些额外的数学运算,我们可以让它保持在视频开头的方式,我们可以摆脱它让着色器更便宜一点,但是如果我们想要有一个更高质量的投影这对于如文本或数字或具有明确方向的值之类的投影事物是正确的,然后我们需要经历翻转以便我们的方向正确,因此我们为纹理投影添加了一些润色

接下来我要做的是向您展示如何将它变成一个材质函数,这样您就可以实际投影整个材质而不仅仅是单个纹理,所以接下来我要做的是向您展示如何做到这一点是的,我要右键单击并转到我们的材料和纹理,我将选择一个新的材质函数,这与材质不同材质函数是它创建一个新节点,我可以添加到材质中,所以我将创建一个材质函数,我只是去调用这个尝试平面投影


我要打开这个函数,现在因为我已经完成了创建这个着色器的工作,我需要做的只是复制上面所有这些节点,并将它们粘贴到我的函数中。所以这很容易现我可以在这里公开输出或者将我的投影结果插入到输出中,现在缺少一些东西我需要公开一些参数以便我可以在外部控制一些参数

例如现在纹理被硬编码到这个网格中我希望能够使用这个功能,并给它不同的纹理所以我要做的是右键单击这里并选择输入,我要添加一个函数输入节点这将允许我从函数外部传入数据,所以我添加了我的函数输入节点,现在我需要告诉它我想要什么样的输入在这种情况下我想给它纹理2d


现在我要将此输入连接到每个纹理样本的纹理槽中,所以这将允许我做的是通过在我的函数中添加一个纹理以在这三个示例中使用,如果我希望能够看到它的外观我实际上可以进入这里并为纹理预览添加一个纹理对象,这是我可以传递的纹理对象将其放入预览图钉中,现在当我在这里单独查看该功能时我可以看到现在看起来会是什么样子的预览

这不是严格要求的,但是如果我没有此预览,您会在那里看到对象已连接它确实会给我此错误缺少函数输入的预览连接这不会阻止我的着色器,但它会阻止我在编辑器中查看该函数时看到该函数作为预览

我希望能够控制的另一件事是我的投影的比例,所以我将添加一个新输入对于这个我们将使用函数输入向量3

我将给它一个默认值 1 1 1,将其连接为预览,然后我可以 在此处单击使用预览作为默认值,我实际上也将为我的其他输入执行此操作默认值,我实际上也将为我的其他输入执行此操作

现在我只需将我的绝对世界位置乘以我的比例值,以便允许我的投影按此输入值进行缩放,我们在这里创建了我们的材质函数,让我们开始吧!并保存并切换回
完整的材质函数

我们将再次打开我们的内容抽屉,这是我们的三平面投影材质函数。你可以看到材质函数有这个光蓝色而不是绿色,这表明它是一种不同类型的我不能单独使用它作为材质,但当我抓住它并将其拖放到另一种材质中

它会变成它自己的小节点我在这里注意到的是,我没有很好地命名我的输入,这被称为一个所以让我们在这里切换回我们的输入
实际上给它们取个好名字然后保存并切换回此处,现在您可以看到


我们有一个不错的比例输入和不错的纹理输入

如果我们取这个材质函数的结果,我们把它插入我们的基地现在你可以看到我正在投影我的鹅卵石

如果我想投影我的网格,我可以添加一个纹理对象在纹理对象中我可以选择我的 uv 网格纹理并将其传递给纹理我的新函数的插槽,现在我得到一个网格我以前做过,如果我插入我的大图原来那些节点和我们现在插入函数一样效果,那样这里有一个vector3值我们可能会给它一些其他值,比如(4,4,4)
所以现在我们的网格将在一米空间内平铺四次


我可能想要公开的另一个值如果我们来到这里,这个值就是我们用来将顶点法线提升到幂的值,所以这将控制我们的混合区域,所以我们需要添加另一个输入,所以这里是我们的函数输入这个类型将是scalar或者只是一个单一的数值我要在这里连接它,我想我可能会给它一个默认值8然后我会检查使用预览值作为默认值

所以现在我们有一个输入控制功率值,我需要给它起一个名字,可以把它称为混合锐度


好吧,我们将保存它并切换回我们的材质,现在你可以看到我有这个混合锐度值


我们希望我们的混合区域非常清晰,可以传入一个常数,我可以传入一个值,比如64现在你可以看到我们沿着投影边界的混合明显减少了,这就是如何您创建了一个执行三平面投影的材质函数,并且具有该函数的好处是节点变得整洁了

现在我可以使用该函数本身,如果我想投影多个纹理

我可以复制它家伙并粘贴它我们可以像这样投影多个对象所以我可以做一个颜色贴图我可以使用,我可以做一个粗糙度,一个镜面金属现在如果我想做一个正常的我需要有一些特殊的考虑,我们需要考虑当然,我们这周没时间了,但下周我将详细介绍如何为法线贴图进行三平面投影

所以在我们今天结束之前让我们切换到unity,我会展示你同样的技术以及如何做到这一点这些三平面修饰unity,所以在这里我们是unity的我们正在从上周离开的地方开始除了我在这里改变的一件事我是否继续,我将我们的纹理设置为我们的网格纹理而不是我们以前的鹅卵石纹理


并且unity会有一些与虚幻略有不同的问题因为它是y向上而不是 z 向上,一些轴倒置当我们看我们的物体时我们这里看到的不是像虚幻中那样颠倒的正面和侧面投影,我们有一个实际上是侧面投影的投影,幸运的是,这很容易修复所以


我们能做的就是来到我们的swizzle 节点,这是我们的x 投影它来自侧面,这是我们的 y 投影来自顶部,我们的 z 投影来自前面

如果我们想修复这个 90 度旋转我们要做的就是在这里交换z和y的分量,所以我只需要输入zy而不是yx,那是从侧面传来的旋转了 90 度并且我们的投影是固定的


但是如果我们查看球体的另一侧您会发现就像在虚幻的unity体中一样,从我们的纹理通过球体投影的问题来看,在球体的反面,我们的文本是反转的所以让我们继续并修复它

就像我们在虚幻中通过添加一个正弦节点所做的那样,所以我要将我的法线向量连接到我的正弦中,这将返回负1 或 1,具体取决于如果法线的三个分量中的每一个都是正或负,就像我在虚幻中所做的那样,我将不得不将我的正弦节点乘以 1 1 负1,因为在unity的情况下,z 轴是倒置的在这里所以我必须先翻转该数据,然后才能使用它现在我有了我的翻转值


接下来我需要做的是从这些中的每一个中制作向量二,所以我将在这里添加一个拆分节点以便我可以将其拆分为它的xy 和 z 组件,然后对于这些组件中的每一个,我将创建一个 vector2并且在我的 vector2 的第二个组件中,我将添加一个硬编码值一,因为当我翻转这些轴时我只想翻转水平分量而不是垂直,所以我要在那里放一个值,这样我就可以将垂直方向一一相乘这基本上只是不理会它然后这是我的z投影翻转值


现在我有了这三个翻转值,我只需要将我的 xy 和 z投影乘以翻转值,以便在另一侧将它们水平翻转,然后为每一个我要添加一个乘法,然后连接我的 x 翻转我的 y 翻转最后连接我的 z 翻转,现在对于球体背面的每一个我已经水平翻转数据,以便数字在两者上都能正确读取正面和背面,它甚至在顶部和底部都可以正常工作非常好

所以现在unity起来,我们要做的就是从中制作一个子图,就像我们在虚幻中所做的那样

我将采取一切这些节点并很好地复制它们,让我们先保存我们的资产现在我们将在此处打开我们的项目窗口

我会在这里右键点击并选择创建着色器图子图

所以现在就像我们在虚幻中所做的那样,在虚幻中它被称为材质函数在unity中,它被称为子图我将打开这个子图,我将继续将我们的着色器图节点粘贴到其中

现在最后我们需要unity添加我们的参数我们使用黑板添加参数所以我要打开黑板然后我要点击这个小加号按钮它允许我添加参数我要添加的第一个参数是纹理2d所以我们将其称为我们的纹理

我可以将我的参数拖到我的图表中并放下它

我想将我的纹理对象添加到我的每个纹理采样器中

需要一个默认值,为此我需要打开我的图形检查器设置默认纹理

让我们添加混合清晰度,这将是一个浮动参数锐度,我可以将它拖到我的场景中
我的混合锐度的默认值我将设置为8

然后 我要添加的最后一个参数是我的投影比例,所以让我们添加一个向量3,称之为投影比例并将其拖到我的图表中

这将在这里投影比例乘以我的位置好吧,我们想要确保我们给我们的投影比例一个默认值(1,1,1,)而不是0。所以一旦我们添加了我们的参数,现在我们可以使用这个子图,

所以我要回到我的测试三元投影材料,现在我将在这里拖入我的sgtri-planer子图你可以看到我已经暴露了我的参数我有我的纹理槽,我的混合锐度和我的投影所以这是我的预览,

如果我现在连接我的sgtri-planer子图,现在你可以看到我的子图正在完成它的工作我可以增加锐度,我可以增加我的次数正在平铺投影我已经创建了这个子图,就像我在虚幻中所做的一样我创建了这个子图,这样可以省去之前所做节点。



原帖地址:UE5和Unity中-三平面投影/修改带有方向性材质朝向问题!【Ben图形/29】 (qq.com)




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

本版积分规则

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