Как рисовать гладкие линии в 2D-сцене с OpenGL без использования GL_LINE_SMOOTH?

Так как GL_LINE_SMOOTH не является аппаратным ускорением и не поддерживается на всех картах GFX, как вы рисуете гладкие линии в 2D-режиме, который будет выглядеть так же хорошо, как с GL_LINE_SMOOTH?

Edit2: Мое текущее решение состоит в том, чтобы нарисовать линию из двух квадратов, которые исчезают до нуля прозрачности от краев, а цвета между этими двумя квадратиками будут цветом линии. он работает достаточно хорошо для рендеринга основных гладких линий и не использует текстурирование и, следовательно, очень быстро визуализируется.

Ответ 1

В настоящее время я использую 2 или 3 квадроцикла для этого, это самый простой способ сделать это.

  • Если толщина строки <= 1px, тогда вам нужно всего 2 квадрата.
  • Если толщина строки > 1px, вам нужно добавить третий квадратик посередине.
  • Толщина затухающих краев не должна изменяться, если толщина линии >= 1px.

На изображении ниже вы можете увидеть квадраты с синими границами. Белый цвет означает, что полная непрозрачность и черный цвет означают непрозрачность нуля (= полностью прозрачный).

enter image description here

Ответ 2

Итак, вы хотите гладкие линии без:

  • сглаживание линии.
  • полноэкранное сглаживание.
  • шейдеры.

Хорошо.

Лучше всего использовать Valve метод альфа-протестированного увеличения. Основная идея, для ваших нужд, заключается в создании текстуры, которая представляет расстояние от линии, при этом центр текстуры будет равен 1.0. Вероятно, это может быть 1D-текстура.

Затем, используя методы, описанные в статье (многие из которых работают с фиксированной функцией, включая антиалиасированную версию), нарисуйте квад, который представляет ваши строки. Очевидно, вам понадобится альфа-смешивание (и, следовательно, оно не зависит от заказа). Вы используете свою ширину линии для управления расстоянием, на котором он становится соответствующим цветом, что позволяет вам делать узкие или широкие линии.


Выполнение этого с помощью шейдеров практически идентично описанному выше, кроме текстуры. Вместо доступа к текстуре расстояния расстояние передается и интерполируется из вершинного шейдера. Для левого края квада вершинный шейдер проходит 0. Для правого края он проходит 1. Вы умножаете это на 2, вычитаете 1 и принимаете абсолютное значение.

Это ваше расстояние от линии (линия, являющаяся центром квадрата). Тогда просто используйте это расстояние точно так же, как алгоритм Valve.

Ответ 3

Включение первого полноэкранного сглаживания и использование квадроцикла будет моим первым выбором.