Металлический цвет буфера кадра для приложений Mac

#metal #metal-performance-shaders

#Металлические #металл-производительность-шейдеры

Вопрос:

введите описание изображения здесьКак я могу прочитать текущий цвет буфера кадра в моем приложении shader для Mac. Я очень легко могу сделать то же самое в приложении ios, используя [[color (0)]].

Я попытался использовать текстуру, как показано ниже, но некоторые пиксели пропущены.

texture2d_array normal_1 [[текстура(0)]]

Образец кода

 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:

Согласно спецификации языка металлического затенения (https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf , комментарии к таблице 12)

Для [[color(m)]] , m используется для указания индекса цветового вложения при доступе (чтении или записи) к нескольким цветным вложениям в функции фрагмента. [[color(m)]] Атрибут поддерживается только в iOS.

Это означает, что вы не можете выполнить обратное чтение пикселей (считывание уже отрисованных пикселей из прикрепленной текстуры за тот же проход рендеринга).

Один из способов избежать необходимости обратного считывания пикселей — это выполнять пиксельную запись и чтение в отдельные этапы рендеринга: вы визуализируете то, что хотите, на первом этапе рендеринга, а затем прикрепляете результат первого этапа рендеринга в виде текстуры, которую вы можете попробовать или просто прочитать.