首页 > 解决方案 > 金属着色器中的 GLSL gl_FragDepth 等效项

问题描述

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

标签: iosopengl-esmetal

解决方案


是的,您使用depth从片段着色器返回的结构成员的属性来指定它。例如,您将创建一个类型,例如:

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

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

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

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


推荐阅读