很多人都用过 WorldAlignedTexture,这是基于 世界空间 的三向贴图投影的材质函数。因为这个材质函数基于世界空间,所有当你模型移动的时候,贴图会发生变化。
下面提供一个基于本地空间的三向贴图投影的材质函数。
只需要在 WorldAlignedTexture 基础上进行简单的修改即可。其实 UE4 的材质函数库里面有一个 LocalAlignedTexture 的材质函数,但是使用的时候发现有问题。所以自己动手实现了一个。
打开 WorldAlignedTexture 材质函数,可以看到,是使用 WorldPosition 来分别控制 XYZ 三个方向的贴图。然后通过 VertexNormal 进行混合。那么,制作一个 LocalAlignedTexture 无非是将世界坐标转换为本地坐标即可。
- 首先,我们要将 WorldPosition 转换为 LocalPosition。UE 提供了坐标转换的节点,可以使用
TransformPosition进行转换,或者直接使用LocalPosition节点。注意,LocalPosition仅记录模型初始大小的像素坐标,如果模型有缩放的,我们需要乘模型的缩放值。使用 ObjectScale 节点来获取模型的缩放值。
- 然后,修正用来混合贴图的法线。
VertexNormal节点输出的法线向量是基于世界空间的,需要将其转换到 LocalSpace。
测试发现,VertexNormal 将转换到 LocalSpace 之后,模型缩放,会造成法线强弱发生变化。
所以,这里也需要乘一个 ObjectScale 来修正法线强度。
(目前发现,当模型有缩放的时候,VertexNormal 在 LocalSpace 和 BoneSpace 都会发生强度的变化。)
最后,在 WorldlAlignedTexture 基础上修改的 LocalAlignedTexture 材质函数。