在Metal着色器中,与GLSL的gl_FragDepth等价的是什么?

3

我想调整Metal着色器中片段的深度。之前,我是通过GLSL的内置输出变量gl_FragDepth来实现这一点的。在iOS上使用苹果的Metal着色器是否有相应的方法?

1个回答

11

是的,你可以通过在你从片元着色器返回的结构体成员上指定 depth 属性来实现。例如,你可以创建以下类型:

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

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

然后,在片段函数中创建这个 struct 的实例,填充它,然后返回它:

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 中同名修饰符的语义相匹配,应在可能的情况下使用它们进行优化。

非常感谢您的精彩回答。作为后续,Metal在片段着色器中是否提供了插值的片段深度,还是需要手动计算? - ndg
3
@ndg,这是通过带有 [[position]] 属性的输入参数获得的。.z 分量是插值深度。 - Ken Thomases

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接