Ультрафиолетовые координаты шейдера металлических фрагментов меняются при чтении в цвете вершины

Я играл с применением дизеринга к простому цветному квадрату и обнаружил странную проблему. У меня есть фрагментный шейдер, который должен вычислять дизеринг на некотором 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 к градиенту и используя координаты текстуры, но мне действительно хотелось бы знать, что здесь происходит, это ошибка или особенность, которую я не понимаю?


person Marko Hlebar    schedule 07.05.2017    source источник


Ответы (1)


Почему вы используете [[point_coord]]? Как вы думаете, что он представляет?

Если вы не рисуете точечные примитивы, вам не следует это использовать. Поскольку вы рисуете «четырехугольник» и, учитывая скриншоты, я предполагаю, что вы не рисуете точечные примитивы.

Я подозреваю, что [[point_coord]] просто не определен и подвержен случайному поведению, когда вы рисуете треугольники. На случайность очевидно влияют особенности (например, расположение стека) фрагментного шейдера.

Вы должны либо использовать [[position]] и масштабировать по размеру окна, либо использовать интерполированное поле в вашей ColoredVertex структуре для переноса координат «текстуры».

person Ken Thomases    schedule 07.05.2017
comment
спасибо за это, попробую добавить поле для texCoord и посмотрю, что с этим будет. Снова читая спецификацию, я неправильно понял атрибут point_coord для чего-то, что ведет себя как координата uv! - person Marko Hlebar; 07.05.2017
comment
Добавлено дополнительное поле, которое работало как шарм, еще раз спасибо за то, что указали мне на очевидное :) - person Marko Hlebar; 07.05.2017