是否可以在Metal中直接使用CIFilters?

问题描述

我正在使用SceneKit和ARKit构建iOS应用。我正在使用SCNTechnique修改SceneKit的呈现并以风格化方式绘制场景的一部分。目前,我正在使用一个简单的金属片段着色器以黑白方式绘制场景:

fragment half4 fragment_shader(VertexOut vert [[stage_in]],texture2d<half,access::sample> scene [[texture(0)]])                                              )
    {
        constexpr sampler samp = sampler(coord::normalized,address::repeat,filter::nearest);
        half4 color = scene.sample(samp,vert.texcoord);
        
        constexpr half3 weights = half3(0.2126,0.7152,0.0722);
        color.rgb = half3(dot(color.rgb,weights)) * 0.1;
        return color;
}

我现在想封装该系统化并使用CIFilter而不是自己编写所有金属代码。是否可以在Metal中调用CIFilters并将其传递给texture2d?如果可以,怎么办?

解决方法

似乎您可以直接通过filters属性将CIFilters分配给SCNNodes。从文档中:

当此数组为非空数组时,SceneKit将节点(及其子节点层次结构)渲染到图像缓冲区中,然后在将滤镜的输出组合到渲染的场景中之前应用滤镜。