Как нарисовать плавную линию в OpenGL с сглаживанием? - PullRequest
13 голосов
/ 18 августа 2010

Мне нужно нарисовать плавную линию в 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();

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

Ответы [ 6 ]

22 голосов
/ 20 августа 2010

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

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

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

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

12 голосов
/ 18 августа 2010

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

Пример:

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

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

  • Вместо этого нарисуйте многоугольник abcd
  • Карта UVs ((0,0), (0,1))
  • свяжите черно-белую текстуру 8x1, белую только в центре
  • рендеринг с фрагментным шейдером, который установил gl_FragColor.a из текстуры

(более или менее техника, используемая в ShaderX5)

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

5 голосов
/ 18 августа 2010

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

4 голосов
/ 22 июля 2013

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

При использовании GLFW 2: glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);

При использовании GLFW 3: glfwWindowHint(GLFW_SAMPLES, 4);

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

1 голос
/ 18 января 2012

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

Несмотря на то, что они выглядят как основные функциональные возможности, мой опыт показывает, что многие аппаратные средства не реализуют их - те, которые не реализуют это последовательно, и если они реализуют это, снижение производительности может быть значительным. если вы посмотрите на документы спецификации OpenGL - они предоставляют отличную ссылку на всю библиотеку, однако вы не найдете там никакого упоминания о них, потому что они не являются частью спецификации. Вы можете подтвердить это в некоторой степени, посмотрев спецификацию для glEnable: khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml

0 голосов
/ 30 ноября 2015

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

...