Рисование границы на 2d полигоне с помощью фрагментного шейдера

У меня есть несколько простых многоугольников (меньше 20 вершин), которые визуализируют плоскость на простой плоскости xy, используя GL_TRIANGLES и плоский цвет, двумерное моделирование.

Я хотел бы добавить границу переменной толщины и другого цвета к этим полигонам. У меня есть кое-что реализовано с использованием тех же вершин и glLineWidth / GL_LINE_LOOP, который работает, но это еще один проход рендеринга и повторяет все преобразования вершин.

Я думаю, что я должен быть в состоянии сделать это в фрагментном шейдере, используя gl_FragCoord и данные вершин и / или координаты текстуры, но я 'Я не уверен, и мои наивные попытки были явно неверны.

Я представляю что-то вроде следующего.

uniform vec2 scale;  // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;

varying vec4 vertex; // in world coords

void main()
{
    if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
    {
        // we're close to the edge the polygon, so we're the border.
        gl_FragColor = border_color;
    }
    else
    {
        gl_FragColor = fill_color;
    }
}

Часть яЯ пытаюсь выяснить, является ли функция distance_from_edge - как это можно рассчитать? Является ли использование gl_FragCoord неправильным подходом - я должен использовать какое-то наложение текстур?

В качестве эксперимента я попытался преобразовать вершину в пиксельное пространство с помощью масштаба, а затем вычислить расстояние между ним и gl_FragCoord в пикселях, но это дает странные результаты, которых я не сделал.Я действительно понимаю. Плюс мне нужно расстояние докрайне вершина, а яЯ не уверен, как это получить.

Есть идеи?

РЕДАКТИРОВАТЬ: на основе НикольВ ответ на мой вопрос становится:

Предполагая, что у меня есть треугольник с 3 угловыми вершинами, помеченными как вершины ребер, и одна вершина в середине, помеченная как не кромка (итого отрисовывается с 3 треугольниками), то как мне интерполировать фрагментный шейдер, чтобы нарисовать границу заданного толщина? Я предполагаю, что передаю флаг края шейдеру фрагмента, а также желаемую толщину линии, и он выполняет некоторые интерполяционные вычисления, чтобы определить расстояние между краем и не краями, и пороговые значения цвета в качестве границы / заливки соответствующим образом. ?

Ответы на вопрос(1)

Ваш ответ на вопрос