Плавные линии в OpenGL - PullRequest
1 голос
/ 08 мая 2009

Я пытаюсь нарисовать более или менее гладкую многосегментную линию в OpenGL. Однако я считаю, что если линия имеет толщину около 3, то соединения между сегментами не являются бесшовными. У них иногда есть промежутки между ними. Есть ли хороший способ сделать эти соединения гладкими и без зазоров? Я ищу что-то похожее на BasicStroke.JOIN_MITER в Java.

Ответы [ 6 ]

5 голосов
/ 11 мая 2009

Наиболее последовательный и переносимый способ рисования линий мышления с использованием OpenGL - это использование выровненных по камере (иначе называемых рекламными щитами) полигонов. Различные реализации API OpenGL по-разному обрабатывают конечные точки линий, и GL_LINE_SMOOTH дает в корне разные результаты в зависимости от платформы. В некоторых реализациях линии толщиной более 1 не определены. Как указано в руководствах по glLineWidth: [Для сглаженных линий] гарантированно поддерживается только ширина 1; другие зависят от реализации.

При этом я использовал простой двухпроходный хак для решения этой самой проблемы.

  1. Отключить запись в буфер глубины glDepthMask (GL_FALSE)
  2. Нарисуйте сглаженные линии желаемой толщины
  3. Нарисуйте сглаженные точки на конечных точках всех линий одинакового размера на линиях. (этот шаг может не понадобиться, чтобы заполнить пробел, однако он должен закруглить точки, где линии встречаются, и сделать все немного более плавным)
  4. Повторно включить буфер глубины для записи glDepthMask (GL_TRUE)

Вы также можете поиграть с настройками буфера глубины. «Разрыв» между строками может быть вызван тем, что 2-я строка не прошла тест глубины для пикселей, которые были смешаны с фоном в альфа-формате.

1 голос
/ 18 февраля 2010

Нарисуйте четырехугольники и используйте текстуру или фрагментный шейдер для нанесения штрихов Фрагментный шейдер также может обеспечивать сглаживание.

1 голос
/ 08 мая 2009

Включение сглаживания с помощью GL_LINE_SMOOTH немного меняет способ рисования линий. Вы можете попробовать это. Также обратите внимание, что для того, чтобы это работало, необходимо включить смешивание.

Главное, что вы не сможете контролировать каждый аспект того, как линии, нарисованные с помощью тонких прямоугольников, могут работать лучше, и после того, как вы напишите свою собственную функцию DrawThickLine, больше не будет никакой работы .. .

1 голос
/ 08 мая 2009

В зависимости от качества реализации OpenGL результаты могут отличаться. Я заметил много различий для плавных линий в разных реализациях.

Возможно, вы захотите использовать другую стратегию для рисования ваших отрезков, например, используя тонкие многоугольники.

0 голосов
/ 08 мая 2009

Чтобы получить что-то плавное, вы можете прибегнуть к кривым Безье или другим видам сплайнов. Я удивлен, что это не встроено в OpenGL, но на сайте есть пример программы для генерации кривых Безье с использованием OpenGL .

0 голосов
/ 08 мая 2009

закрасьте линии на половину толщины на каждом конце. Это должно устранить «пробелы», хотя это даст более резкое соединение линий, а не более плавное.

...