Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: navrocky от Март 05, 2013, 16:38



Название: [РЕШЕНО] Как включить антиалиасинг в OpenGL?
Отправлено: navrocky от Март 05, 2013, 16:38
Рисую в QGLWidget. Знатоки, подскажите, как грамотно включить антиалиасинг в сцене?

Вот такая штука не работает:
Код
C++ (Qt)
   glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
   glEnable(GL_POLYGON_SMOOTH);
 


Название: Re: Как включить антиалиасинг в OpenGL?
Отправлено: navrocky от Март 06, 2013, 11:03
Что, совсем никто не знает  ???


Название: Re: Как включить антиалиасинг в OpenGL? (OFFTOP)
Отправлено: Figaro от Март 06, 2013, 11:21
Не любитель я OpenGL, но тему такую видел то ли на РСДН, то ли на Stackoverflow...


Название: Re: Как включить антиалиасинг в OpenGL?
Отправлено: Igors от Март 06, 2013, 11:33
Ну знать тут особо нечего  :) Во всяком случае Ваши 2 строчки лучше переставить местами (или вообще не делать glEnable для этой переменной). Если не поможет - попробуйте GL_FASTEST, дальше компилите любой примерчик с анти-алиасом и смотрите работает ли там


Название: Re: Как включить антиалиасинг в OpenGL?
Отправлено: ssoft от Март 06, 2013, 12:45
OpenGL функциями так:

Код:

glEnable( mode ); // включает
glDisable( mode ); // выключает


значения mode
Код:
mode = GL_POINT_SMOOTH; // для точек
mode = GL_LINE_SMOOTH; // для линий
mode = GL_POLYGON_SMOOTH; // для полигонов

Если используется QPainter, нужно не забывать

Код:
QPainter painter(this);
painter.beginNativePainting();

...

painter.endNativePainting();

Если не помогает, то нужен пример, когда не работает.


Название: Re: Как включить антиалиасинг в OpenGL?
Отправлено: mitrich от Март 06, 2013, 15:02
GL_POLYGON_SMOOTH - неудобная и устаревшая функциональность, оставленная для обратной совместимости.
Использовать надо мультисэмплинг. Для его включения, необходимо чтобы контекст отображения OpenGL создавался с поддержкой мультисэмплинга.

Перед созданием QGLWidget:
Код
C++ (Qt)
QGLFormat fmt;
fmt.setSampleBuffers(true);
fmt.setSamples(8); //2, 4, 8, 16
 
QGLFormat::setDefaultFormat(fmt); //либо так, либо передавать fmt непоср. в конструктор QGLWidget или QGLFormat
 

После:
Код
C++ (Qt)
glEnable(GL_MULTISAMPLE);
 


Название: Re: Как включить антиалиасинг в OpenGL?
Отправлено: navrocky от Март 07, 2013, 13:20
GL_POLYGON_SMOOTH - неудобная и устаревшая функциональность, оставленная для обратной совместимости.
Использовать надо мультисэмплинг. Для его включения, необходимо чтобы контекст отображения OpenGL создавался с поддержкой мультисэмплинга.

Два чая этому господину! Отлично работает.