#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.
Это означает, что вы не можете выполнить обратное чтение пикселей (считывание уже отрисованных пикселей из прикрепленной текстуры за тот же проход рендеринга).
Один из способов избежать необходимости обратного считывания пикселей — это выполнять пиксельную запись и чтение в отдельные этапы рендеринга: вы визуализируете то, что хотите, на первом этапе рендеринга, а затем прикрепляете результат первого этапа рендеринга в виде текстуры, которую вы можете попробовать или просто прочитать.