适用于Mac应用程序的金属中的帧缓冲区颜色

时间:2019-03-19 06:50:38

标签: metal metal-performance-shaders

enter image description here如何在Mac应用程序的着色器中读取帧缓冲区当前颜色。 我很容易在iOS应用中使用[[color(0)]]做同样的事情。

我尝试使用纹理,如下所示,有些像素丢失了。

texture2d_array normal_1 [[texture(0)]]

SampleCode

fragment float4 funcname(QuadFragIn     inFrag [[ stage_in ]],
                                  texture2d_array<float> normal_1 [[texture(0)]])
{



    float4 color_0 = float4(normal_1.sample(tex_sampler, inFrag.m_TexCoord, 0));
    float4 color_1 = float4(normal_1.sample(tex_sampler, inFrag.m_TexCoord, 1));
    float4 color_2 = float4(normal_1.sample(tex_sampler, inFrag.m_TexCoord, 2));

    int index = inFrag.index;

    if(index == 0)
    {
        return color_0;
    }
    else if(index == 1)
    {
        return color_1;
    }
    else
    {
        return color_2;
    }

}[![enter image description here][1]][1]

在输出文件附件中,白条是相关问题。

1 个答案:

答案 0 :(得分:0)

根据金属阴影语言规范(https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf,表12下的注释)

  

对于[[color(m)]],m用于在访问(读取或读取)时指定颜色附件索引。   写作)片段功能中的多个颜色附件。 [[color(m)]]属性仅   在iOS中受支持。

这意味着您不能进行像素回读(在同一渲染过程中从附加纹理读取已经渲染的像素)。

避免像素回读的一种方法是在单独的渲染通道中进行像素写入和读取:您可以在第一次渲染通道中渲染所需的内容,然后将第一次渲染通道的结果附加为纹理,可以对其进行采样或只是阅读。