如何在 RealityKit 中为 visionOS 制作动画自定义着色器

ShaderGraphParameterAnimationExample

此示例演示了如何使用 Reality Compose Pro 构建自定义着色器图、在项目中使用它,然后在 Swift 中对着色器图的参数进行动画处理,从而修改 VisionOS RealityKit 模型。

说明

目标是在 vision OS 中呈现一个剪辑球体并对球体的剪辑进行动画处理。请参见以下示例:

Code_2024-02_21-34-59

通过在运行时对球体的几何图形进行动画处理来执行此操作将效率低下。更好的方法是使用着色器。但是,由于正当的安全隐患(感谢 Facebook),因此在 VisionOS 上不支持着色器。但是,visionOS 上的 RealityKit 的确提供了使用 Reality Compose Pro 创建 MaterialX 着色器的能力。此示例演示了如何使用 Reality Compose Pro 创建自定义着色器图、将着色器参数公开到 Swift,然后对它们进行动画处理。

着色器图

alt text

这个简单的着色器图控制几何图形像素的输出不透明度,具体取决于模型中心位置的距离。我取几何图形的纹理坐标值(参见示例中的Texcoord节点),从中提取 Y 值(Swizzle_1节点),然后将其(ifgreaterifgreater1)与用户定义的参数MIN_YMAX_Y进行比较,以确定像素是否应该可见。着色器图的输出是无光泽表面(UnlitSurface材料)。

无光泽表面的输出颜色被硬编码为洋红色。要在生产环境中使用这个着色器图,你应当将颜色公开为一个参数。你可能还需要创建此图的变体以适应不同的材料类型。

有可能简化此图,但出于此示例的目的,我想保持它的简单性。

在 Swift 中修改参数

Swift 代码相对简单。你可以使用以下代码修改材料的着色器图参数:

try material.setParameter(name: "MIN_Y", value: .float(value))

访问模型实体及其上的材料会有点痛苦,但我一直在使用我的 RealityKitSupport 辅助库来简化这个过程。

在 Swift 中对参数进行动画处理

不幸的是,RealityKit(相当复杂的)显式动画功能不支持对着色器参数进行动画处理。但是,你可以编写你自己的基于计时器的动画循环来自己对参数进行动画处理。此代码实现了 SwiftUI TimelineView 来对每一帧的参数进行动画处理(通过 RealityView 的更新处理程序)。该示例很直接,但你可能需要为实际项目使用更复杂的动画实现。

  • FB13645019:RealityKit 的动画系统不能对 ShaderGraphMaterial 自定义参数进行动画处理