Я пишу 3D-приложение с использованием металла. Для рендеринга в 3D мне нужно управлять каждым пикселем. В обычных экранах это, похоже, работает нормально с переменной [[position]], переданной в шейдер. Но на экране Retina, где есть коэффициент масштабирования, каждая координата экрана представляет 2x2 (или 3x3) пиксели.Пиксельные координаты в металлическом фрагменте шейдера
Позвольте мне подробно рассмотреть экран iPhone 6: экранные координаты 375x667 и пиксельные координаты - 750x1334. Вот мой код (тест) шейдера:
fragment half4 myFragShader(vtxOut in [[stage_in]],
float4 pcoord [[position]])
{
if(pcoord.x >187.5) //187.5=375/2
return half4(1.0 , 0.0 , 0.0, 1.0); // return red
else return half4(0.0 , 0.0 , 1.0, 1.0); // return blue
}
С выше тестового кода, я получаю (точно) левая половина экрана как синий и правую половину, как красный. Это означает, что pcoord приходит в систему координат 375x667, а не в 750x1334.
Вопросы:
Будет пиксельный шейдер вызывается для каждого пикселя координаты? Или только для каждой экранной координаты?
Если он вызван для каждой пиксельной координаты, как мне получить доступ к каждому пикселю внутри шейдера фрагмента?
Я пробовал то же самое с pcoord.y (в моем коде выше) с аналогичным результатом.