我用一个非常简单的碎片函数做深度剥离:
struct VertexOut {
float4 position [[ position ]];
};
fragment void depthPeelFragment(VertexOut in [[ stage_in ]],
depth2d<float, access::read> previousDepth)
{
float4 p = in.position;
if(!is_null_texture(previousDepth) && p.z <= previousDepth.read(uint2(p.xy)))
{
discard_fragment();
}
}
MTLPixelFormatDepth32Float
)
然而在iPad上,这个过程不会终止。有一些(不是全部)片段,尽管在前一个过程中被渲染,但在随后的过程中不会被丢弃。
位置属性的z坐标是否总是写入深度缓冲区的值?
请注意,我不能简单地限制传递的次数(我没有将此用于OIT)。
更新:
点的分布使得这看起来像是一个浮点精度问题。
此外,如果我将epsilon添加到前面的深度缓冲区:
p.z <= previousDepth.read(uint2(p.xy))+.0000001