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