在UE4中制作彩虹着色器
介绍
我是James Emory,我做独立/自由开发者已经 5 年了。我最初是在Photoshop 中工作的纹理艺术家,然后转到Substance Designer,它至今仍是我最喜欢的程序之一。几年前,我转向技术艺术,因为我不喜欢建模,并且觉得学习着色器是纹理制作的下一个合乎逻辑的步骤。我目前在即将推出的 PC 恐怖游戏Lunacy: Saint Rhodes 中担任技术美工。
UE4中的彩虹色着色器
目标
我开始为开发 ARK 模组的客户构建这个彩虹色着色器,他们需要复制传统的甲壳虫外壳外观。在 Polycount 论坛上有一个非常科学准确的彩虹色着色器,这是我的第一种方法,但它有相当多的问题,因为它是用Unreal的自定义 HLSL 节点编写的(这不会很容易工作,因为 ARK 的引擎版本相当旧),它远非艺术家友好。在这一点上,我知道我需要一种自定义方法,该方法可以在没有 HLSL 的情况下在如此旧的引擎版本上运行,这导致着色器可以在以完全不同的方式构建的同时产生与 Polycount 版本相似的结果。
工作策略
首先,我将简要概述我们将要构建的内容,然后解释它是如何工作的。首先,将有 5 个材料函数:3 个主要函数和 2 个辅助函数。生成颜色模式的 3 种方法是色调偏移、Rodrigues 旋转和 zucconi6 光谱。3个主要功能的前半部分完全相同,后半部分特定于生成的颜色方法。
所以,我最初的方法是通过基于 UV 的色调转换来处理彩虹色,因为我想尝试在没有预烘焙纹理的情况下创建颜色。后来我将它扩展到包括紫外线不可知方法。使用色调偏移产生彩虹渐变是我多年前学会的一个技巧,在这里使用它似乎是一个很好的应用。最初,此方法仅受 UV 约束,然后我将其调整为不受此限制的工作。话虽如此,3 种方法中有 2 种包含用于在 UV/3D 坐标中工作的开关,而 Rodrigues 仅在 3D 空间中工作。
这是我最初的原型图,然后将其扩展到现在的系统。
这是应用于测试网格的结果。
这是一个好的开始,虽然还不够,但它鼓舞了我继续前进,因为我觉得自己走在正确的轨道上。所以我开始添加功能,例如无紫外线方法和光源支持。
基金会
首先,我们必须通过获取像素法线(或转换到世界空间的指定法线)和相机矢量的点积来生成类似菲涅耳的效果。从那里,我们生成一个半矢量,传统上用于镜面高光,但在这种情况下,我们使用它来确保彩虹色不会一次应用于所有地方,而是基于指定光的方向来源。
这是 3 个主要功能中每一个的前半部分。我现在想做的是涵盖2个辅助功能,然后再回到完成3个主要功能。
辅助函数
第一个辅助函数是罗德里格斯旋转公式。我在 UDK Polycount 论坛上遇到了这个问题,因此感谢发布它的用户。该公式在给定旋转轴和旋转角度的情况下旋转欧几里得矢量。更多信息在这里。
将其实现到自己的主函数中如下所示:
接下来是 zucconi6 渐变函数,这将产生显着的最佳颜色结果,所以这是所有 3 种方法中我最喜欢的。此函数以 Alan Zucconi 的名字命名,他是此渐变的代码创建者。我强烈建议阅读他的薄膜系列,改善彩虹和他推出的任何其他东西,因为他太棒了。
现在,他在那篇文章中提供的代码是专门针对Unity和Shadertoy 的,我使用的是 UE4。虽然您可以使用自定义 HLSL 节点将 Shadertoy 代码移植到 UE,但事实证明这很烦人,因为它具有辅助功能。我最终做的只是将 Shadertoy 代码移植到 UE 的节点图中,并得到了非常相似的结果,我很满意。
我不会提供此屏幕截图,因为某些节点的颜色值非常具体,并且无法在一个图形屏幕截图中包含所有这些信息,因此我所做的是为该函数创建了一个pastebin 链接. 您所要做的就是 Ctrl + A、Ctrl + C 该页面底部的文本,然后 Ctrl + V 进入您的图表,它会立即出现。
这是代码产生的梯度。
这是如何将函数实现到它自己的主函数中:
最后,我们有hueshift方法。这是我尝试的第一种方法,UV 版本是我在原始帖子/视频中应用于汽车的方法。
这就是所有功能的内容,这就是您将其中一个功能实现到材质中的方式。对于半向量(光源支持),您需要将光源的旋转应用于蓝图中的参数集合。请记住,这仅适用于一盏灯。
就汽车而言,我加法使用了 UV 绑定函数类型(在基色上使用加法而不是乘法),并从这些函数中获得了一些非常好的结果。在我看来,这就是功能的亮点。
应用于材料的 z6 彩虹色的最终结果
加起来
总而言之,这只是简单的相机/法线向量 + 光支持被输入到渐变中,所以在一天结束时,您可以使用 UE 的曲线工具创建您想要的任何渐变并输入这些主要功能的前半部分进入曲线并拥有您想要的任何颜色。话虽如此,能够使用这些功能即时生成不同的颜色是非常方便的,至少对我来说是这样。