iOS / Metal:如何在某一点读取深度缓冲区?

时间:2015-02-10 05:40:06

标签: ios opengl-es metal

我想从深度缓冲区读取。在OS OS X上我可以这样做:

float depth[2][2]; // get 2x2 for bilinear interpolation
glReadPixels(s.x, s.y, /*width*/2, /*height*/2, GL_DEPTH_COMPONENT, GL_FLOAT, depth);

(请注意,iOS上的OpenGL ES无法从深度缓冲区读取)

什么与金属相当?

看起来我需要这样做:

_renderPassDescriptor.depthAttachment.storeAction = MTLStoreActionStore;

然后以某种方式通过CPU从缓冲区读取?

虽然也许有更好的方法,因为我只需要一个点(触摸的位置)。片段着色器是否可以存储该点的深度(或双线性插值的2x2),从而允许我将storeAction保留为MTLStoreActionDontCare?

1 个答案:

答案 0 :(得分:3)

我将深度存储操作设置为MTLStoreActionStore,然后在render方法中执行以下操作:

[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer) {

    // We're done! So read from the depth texture.        

    // Just read the center pixel for now.
    MTLRegion region = MTLRegionMake2D(_depthTex.width/2, _depthTex.height/2, 1, 1);

    float depth;
    [_depthTex getBytes:&depth bytesPerRow:_depthTex.width*4 fromRegion:region mipmapLevel:0];

    NSLog(@"read depth: %f", depth);

    dispatch_semaphore_signal(block_sema);

}];

这有效并被确认为正确的做法&#34;由Apple开发人员在论坛上发布。

请注意,iOS上的OpenGL ES无法从深度缓冲区读取数据。金属FTW!