如何使用Metal将深度缓冲区保存到纹理?

时间:2016-05-27 17:48:30

标签: metal

我想将深度缓冲区保存到金属质地中,但我尝试的任何东西似乎都无法工作。

_renderPassDesc.colorAttachments[1].clearColor = MTLClearColorMake(0.f, 0.f, 0.f, 1.f);
[self createTextureFor:_renderPassDesc.colorAttachments[1]
                  size:screenSize
            withDevice:_device
                format:MTLPixelFormatRGBA16Float];

_renderPassDesc.depthAttachment.loadAction = MTLLoadActionClear;
_renderPassDesc.depthAttachment.storeAction = MTLStoreActionStore;
_renderPassDesc.depthAttachment.texture = self.depthTexture;
_renderPassDesc.depthAttachment.clearDepth = 1.0;   

当我将depthTexture传递到我的着色器(对我的其他纹理中的数据工作正常)时,我得到的只是红色像素。

当我将clearDepth更改为接近零的值时,我会变得更暗红色。也许我在某种程度上没有在我的着色器中正确地采样纹理?

fragment float4 cubeFrag(ColorInOut in [[stage_in]],
                     texture2d<float> albedo [[ texture(0) ]],
                     texture2d<float> normals [[ texture(1) ]],
                     texture2d<float> albedo2 [[ texture(2) ]],
                     texture2d<float> normals2 [[ texture(3) ]],
                     texture2d<float> lightData [[ texture(4) ]],
                     texture2d<float> depth [[ texture(5) ]])
{
    constexpr sampler texSampler(min_filter::linear, mag_filter::linear);
    return depth.sample(texSampler, in.texCoord).rgba;
}

2 个答案:

答案 0 :(得分:4)

使用depth2d<float>代替texture2d<float>作为参数类型,并从深度纹理float val = depth.sample(texSampler, in.texCoord);中读取浮点数

答案 1 :(得分:0)

好的,事实证明我只需要使用depth2d而不是texture2d:

depth2d<float> depth [[ texture(5) ]])