ARView 对应于 SCNView 的 SCNTechnique?

ARView counterpart to SCNView's SCNTechnique?

我用 ARKit 制作了一个项目,它使用金属着色器来执行镜像效果,这是使用 sceneView.technique 分配的。我试图弄清楚是否可以将项目转换为使用 RealityKit,但找不到 RealityKit 使用的 ARView 的任何相似特征。 RealityKit 中是否有任何类似于 sceneView.technique 的东西可以让我像现在一样简单地分配金属着色器,或者我是否必须重新设计金属着色器与视图的交互方式?

我目前的实现是基于

关于ARView镜像

在 RealityKit 2.0 中镜像 ARView 的最简单方法是使用 CGAffineTransform 3x3 矩阵。

 ┌             ┐
 |  a   b   0  |
 |  c   d   0  |
 |  tx  ty  1  |
 └             ┘

我们需要水平反映一个场景(包括视频),所以我们必须使用 -1 xScale 乘数:

 ┌             ┐
 | -1   0   0  |
 |  0   1   0  |
 |  0   0   1  |
 └             ┘

代码如下:

arView.transform = .init(a: -1, b: 0, c: 0, d: 1, tx: 0, ty: 0)


关于金属着色器

仅在 RealityKit 2.0 中 CustomMaterial 允许您实现 Metal 的顶点和片段着色器。因此,您可以使用顶点着色器实现许多有趣的效果,包括在 X 轴上翻转模型。

.swift file:

import Metal
import RealityKit

let device = MTLCreateSystemDefaultDevice()
    
guard let defaultLibrary = device!.makeDefaultLibrary()
else { return }
    
let shader = CustomMaterial.SurfaceShader(named: "basicShader",
                                             in: defaultLibrary)
    
let modifier = CustomMaterial.GeometryModifier(named: "basicModifier",
                                                  in: defaultLibrary)
    
box.model?.materials[0] = try! CustomMaterial(surfaceShader: shader, 
                                           geometryModifier: modifier, 
                                              lightingModel: .lit)

.metal file:

#include <metal_stdlib>
#include <RealityKit/RealityKit.h>

using namespace metal;
using namespace realitykit;

[[visible]]
void basicShader(realitykit::surface_parameters shader)
{
    surface::surface_properties sf = shader.surface();
    
    sf.set_base_color( half3(1.0f, 0.7f ,0.0f) );
};

[[visible]]
void basicModifier(realitykit::geometry_parameters modifier)
{
    float3 pose = modifier.geometry().model_position();

    // your code...
};

但是,RealityKit 视图的 SCNTechnique 对应项尚未“烘焙”...


您可以使用 RealityKit 2 的 PostProcessing API,这应该可以很容易地实现所需的效果。

例如,您可以将 Core Image Filter 或 Metal 内核函数应用于渲染场景。有点类似于SCNTechnique。

https://developer.apple.com/documentation/realitykit/implementing_special_rendering_effects_with_realitykit_postprocessing?changes=l_6&language=objc