代码之家  ›  专栏  ›  技术社区  ›  Taylor

iOS上深度缓冲精度的损失

  •  1
  • Taylor  · 技术社区  · 6 年前

    我用一个非常简单的碎片函数做深度剥离:

    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)。

    更新:

    Depth texture for test sphere

    点的分布使得这看起来像是一个浮点精度问题。

    此外,如果我将epsilon添加到前面的深度缓冲区:

    p.z <= previousDepth.read(uint2(p.xy))+.0000001
    

    0 回复  |  直到 6 年前