У меня есть несколько простых многоугольников (менее 20 вершин), которые отображаются на простой плоскости ху, используя GL_TRIANGLES и плоский цвет, 2d-симуляцию.
Я хотел бы добавить границу переменных толщин и другой цвет для этих полигонов. У меня есть что-то реализованое с использованием тех же самых вершин и 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 в пикселях, но это дает странные результаты, которые я действительно не понял. Плюс мне нужно расстояние до края, а не от вершины, но я не уверен, как это получить.
Любые идеи?
EDIT: на основе ответа Nicol мой вопрос будет:
Предполагая, что у меня есть треугольник с тремя угловыми вершинами, отмеченными как вершины ребра, а одна вершина в середине отмечена как не ребро (так отображается с тремя треугольниками в целом), то как мне интерполировать в шейдере фрагмента, чтобы нарисовать границу данной толщины? Я предполагаю, что передаю флаг грани в шейдер фрагмента, а также желаемую толщину линии, и он делает некоторый интерполяционный расчет, чтобы выяснить расстояние между ребрами, а не вершинами ребер, и пороговое значение цвета как границы/заливки по мере необходимости