GLSL gl_FragDepth 在金属着色器中等效

GLSL gl_FragDepth equivalent in Metal shaders

我想在金属着色器中调整片段深度。以前我是通过 GLSL 的内置输出变量 gl_FragDepth 来实现的。在 iOS 上是否有使用 Apple 的 Metal 着色器的等效方法?

是的,您可以使用片段着色器 return 结构成员的 depth 属性来指定它。例如,您将创建如下类型:

struct FragmentOut {
    half4 color [[color(0)]];
    float depth [[depth(any)]];
};

然后,在您的片段函数中,创建此结构的一个实例,填充并 return 它:

fragment FragmentOut my_frag_function(...) {
    FragmentOut out;
    out.color = // compute fragment color (for first color attachment)
    out.depth = // compute fragment depth
    return out;
}

请注意,您可以指定 greaterless 之一作为深度属性参数,而不是 any,这表示您提供的片段深度将分别为,大于或小于内插片段深度。这些说明符的语义与 OpenGL 中同名的说明符的语义相匹配,您应该尽可能使用它们来进行优化。