Я играл с применением дизеринга к простому цветному квадрату и обнаружил странную проблему. У меня есть фрагментный шейдер, который должен вычислять дизеринг на некотором uv
и возвращать размытый цвет. Это отлично работает с текстурированным квадратом, но, как ни странно, когда я получаю доступ к данным цвета из моего inVertex
, координаты uv
меняются на некоторые странные значения, а значение y
, кажется, отображается на ось x
. Я попытаюсь проиллюстрировать, что происходит, когда я что-то меняю в коде фрагментного шейдера.
fragment float4 fragment_colored_dithered(ColoredVertex inVertex [[stage_in]],
float2 uv[[point_coord]]) {
float4 color = inVertex.color;
uv = (uv/2) + 0.5;
if (uv.y < 0.67) {
return float4(uv.y, 0, 0, 1);
}
else {
return color;
}
}
Там, где в левой части изображения показан мой градиентный четырехугольник, обратите внимание, что if (uv.y < 0.67)
соответствует значениям x на изображении ????.
Если я изменю этот шейдер фрагмента и ничего больше в коде, например, где I return float4(0, 0, 1, 0)
вместо inVertex.color
, координаты uv
отображаются правильно.
fragment float4 fragment_colored_dithered(ColoredVertex inVertex [[stage_in]],
float2 uv[[point_coord]]) {
float4 color = inVertex.color;
uv = (uv/2) + 0.5;
if (uv.y < 0.67) {
return float4(uv.y, 0, 0, 1);
}
else {
return float4(0, 0, 1, 0); //return color;
}
}
Дает следующий (правильный) результат:
Я думаю, что могу обойти эту проблему, применив текстуру 1x1 к градиенту и используя координаты текстуры, но мне действительно хотелось бы знать, что здесь происходит, это ошибка или особенность, которую я не понимаю?