Рисование линий с помощью GLSL - PullRequest
0 голосов
/ 28 марта 2011

возможно ли нарисовать линию с помощью GLSL, используя GL_TRIANGLES?

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь нарисовать линию с помощью самцов Кротовины, и она рисует только треугольник.

Приветствия

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

если вы включили рендеринг края, просто нарисуйте треугольник с точками 1 и 3 в одной и той же позиции. Это не эффективно, но работает.

0 голосов
/ 01 июня 2017

Если можете, используйте геометрический шейдер. Передавайте две вершины и ширину линии, генерируйте 4 точки, образуя два треугольника, сдвигая вершины, рендеринг и готово ... Но рисование широких линий с использованием треугольников без геометрического шейдера также можно выполнить в OpenGL ES 2.0 (без геометрических шейдеров) и в настольном OpenGL с использованием только вершинных шейдеров:

Создайте свои данные вершин, чтобы дублировать вершины для каждой строки (4 вершины в строке). Для каждой вершины передайте два дополнительных атрибута vec2 / vec3 для вершин предыдущей и следующей строки (для вычисления правильных соединений линий) ИЛИ просто передайте направление линии vec2 / vec3. Также добавьте атрибут вершины с плавающей точкой, который представляет «нормаль», направление, в котором нужно сдвигать каждую вершину. Для одной конечной точки линии (которая теперь использует две вершины), установите «нормаль» в одном направлении, а для дубликатов - в противоположном направлении. Создайте треугольники из этих вершин (с помощью индексации или чего-либо еще) и визуализируйте с помощью GL_TRIANGLES.

В вершинном шейдере используйте вершину и предыдущую или следующую вершину, чтобы вычислить направление линии и (просто в 2D-случае) сгенерировать вектор, перпендикулярный ей. Умножьте это на «нормальный», который вы передали как атрибут вершины. Это сместит ваши линии "в стороны", так что будет создан фактический треугольник.

Генерация линий с правильным размером пикселя проста в 2D (хотя и с равномерным масштабированием, но также возможна с неравномерным масштабированием) - используйте коэффициент масштабирования из матрицы вида модели (например, modelView [0] [0]) и разделите ширину линии на нее в вершинном шейдере. В 3D это немного сложнее ...

Здесь есть хорошее объяснение техники здесь , анимированные примеры здесь и исходный код здесь .

...