Как нарисовать гладкую линию с помощью antialias

Мне нужно нарисовать гладкую линию в openGl, и вот что я сделал.

glEnable( GL_LINE_SMOOTH );
glEnable( GL_POLYGON_SMOOTH );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
glBegin( GL_LINE_STRIP );
        for( UINT uiPoint = 0; uiPoint < iNumPoints; ++uiPoint )
        {
            const Coord &Node = vecPoints[uiPoint];
            glVertex3f( Node.x, Node.y, Node.z );
        }
glEnd();

Что еще я могу сделать?

Ответ 1

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

Пример:

   a (0,1)                                  b (0,1)
    +--------------------------------------+
  A |                                      | B
----+--------------------------------------+----
    |                                      |  
    +--------------------------------------+
   d (0,0)                                  c (0,0)

Предположим, вы хотите нарисовать сегмент [AB].

  • Нарисуйте многоугольник abcd вместо
  • Сопоставьте UV-объекты ((0,0), (0,1))
  • привязать черно-белую текстуру 8x1, которая является белой только по центру.
  • визуализировать с помощью фрагментарного шейдера, который устанавливает gl_FragColor.a из текстуры

(более или менее метод, используемый в ShaderX5)

Но сделайте это, только если вы не можете использовать MSAA.

Ответ 2

Вам также нужно включить смешение для выравнивания строк для работы. Попробуйте:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

а затем рисование линий. Это также может помочь установить ширину линии на нецелую ширину.

Как уже упоминалось, это не сгладит края многоугольника, но создаст сглаженные линии.

Ответ 3

GL_POLYGON_SMOOTH сам по себе вам нехорошо. При создании контекста OpenGL вам необходимо принудительно сгладить. Что вы используете для создания окна OpenGL? Посмотрите, поддерживает ли он сглаживание среди своих параметров. Или вы можете заставить сглаживание для всех программ OpenGL с помощью инструментов Nvidia или ATI... Все зависит от вашей настройки.

Ответ 4

Как уже упоминалось, включение антиалиасинга помогает - как включить это, зависит от вашего создания контекста, но эта информация, надеюсь, будет полезна для пользователей GLFW.

Если используется GLFW 2: glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);

Если используется GLFW 3: glfwWindowHint(GLFW_SAMPLES, 4);

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

Ответ 5

Нет гарантии, что GL_LINE_SMOOTH или GL_POLYGON_SMOOTH что-нибудь сделают.

Ответ 6

Nanovg - это 2D-чертежный пакет, который отображает OpenGL. Я использовал его вместе с обычным OpenGL, чтобы заполнить и погладить 2D-пути и строки. https://github.com/memononen/nanovg