Если можете, используйте геометрический шейдер. Передавайте две вершины и ширину линии, генерируйте 4 точки, образуя два треугольника, сдвигая вершины, рендеринг и готово ...
Но рисование широких линий с использованием треугольников без геометрического шейдера также можно выполнить в OpenGL ES 2.0 (без геометрических шейдеров) и в настольном OpenGL с использованием только вершинных шейдеров:
Создайте свои данные вершин, чтобы дублировать вершины для каждой строки (4 вершины в строке). Для каждой вершины передайте два дополнительных атрибута vec2 / vec3 для вершин предыдущей и следующей строки (для вычисления правильных соединений линий) ИЛИ просто передайте направление линии vec2 / vec3. Также добавьте атрибут вершины с плавающей точкой, который представляет «нормаль», направление, в котором нужно сдвигать каждую вершину. Для одной конечной точки линии (которая теперь использует две вершины), установите «нормаль» в одном направлении, а для дубликатов - в противоположном направлении. Создайте треугольники из этих вершин (с помощью индексации или чего-либо еще) и визуализируйте с помощью GL_TRIANGLES.
В вершинном шейдере используйте вершину и предыдущую или следующую вершину, чтобы вычислить направление линии и (просто в 2D-случае) сгенерировать вектор, перпендикулярный ей. Умножьте это на «нормальный», который вы передали как атрибут вершины. Это сместит ваши линии "в стороны", так что будет создан фактический треугольник.
Генерация линий с правильным размером пикселя проста в 2D (хотя и с равномерным масштабированием, но также возможна с неравномерным масштабированием) - используйте коэффициент масштабирования из матрицы вида модели (например, modelView [0] [0]) и разделите ширину линии на нее в вершинном шейдере. В 3D это немного сложнее ...
Здесь есть хорошее объяснение техники здесь , анимированные примеры здесь и исходный код здесь .