gpt4 book ai didi

iOS/Metal : how to read from the depth buffer at a point?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:02:18 27 4
gpt4 key购买 nike

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

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 时,您无法从深度缓冲区中读取数据)

Metal 的等价物是什么?

看起来我需要做:

_renderPassDescriptor.depthAttachment.storeAction = MTLStoreActionStore;

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

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

最佳答案

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

[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);

}];

这行得通,并被 Apple 开发人员在论坛上确认为“正确的方法”。

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

关于iOS/Metal : how to read from the depth buffer at a point?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28424883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com