我想调整Metal着色器中片段的深度。之前,我是通过GLSL的内置输出变量gl_FragDepth来实现这一点的。在iOS上使用苹果的Metal着色器是否有相应的方法?
是的,你可以通过在你从片元着色器返回的结构体成员上指定 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;
}
注意,你可以指定 greater
或 less
之一作为深度属性参数,而不是 any
。这表示您提供的片段深度将分别大于或小于插值片段深度。这些修饰符的语义与 OpenGL 中同名修饰符的语义相匹配,应在可能的情况下使用它们进行优化。
[[position]]
属性的输入参数获得的。.z
分量是插值深度。 - Ken Thomases