Войти
ПрограммированиеФорумГрафика

Сглаживание точек и линий

#0
(Правка: 20:43) 20:31, 18 июля 2021

Как добиться чтобы линии были без ступенек, а точки не квадратные (используется компонент QGLWidget, требуется обеспечить работу на платформе с версией Open GL 2.1)?

Вот код инициализации, который использую я:

void GLWidget::initializeGL()
{

    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glShadeModel(GL_SMOOTH);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.0f);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glDisable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);

    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);

    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
    glEnable(GL_POINT_SMOOTH);
    glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
....
}

Вот код отрисовки:

// Размер точки и ширина линии
#define POINT_SIZE  5.0f
#define LINE_WIDTH  1.0f

void GLWidget::paintGL()
{
....

    glLineWidth(LINE_WIDTH);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2,GL_DOUBLE,0,vertex.data());
    glDrawArrays(GL_LINE_STRIP,0,vertex.size()/2);

    glPointSize(POINT_SIZE);
    glVertexPointer(2,GL_DOUBLE,0,vertex2.data());
    glDrawArrays(GL_POINTS,0,vertex2.size()/2);


    glDisableClientState(GL_VERTEX_ARRAY);
    glFlush();
....

}

Сглаживание включено. Что может быть не так?


#1
20:44, 18 июля 2021

а если просто сделать рендертаргет в два раза больше?

#2
20:56, 18 июля 2021
а если просто сделать рендертаргет в два раза больше?

Как именно?
#3
(Правка: 22:58) 22:26, 18 июля 2021

не знаю точно как это делается в куте но вижу там есть класс
QPixmap Class
https://doc.qt.io/qt-5/qpixmap.html
текстура в которую можно рисовать классом
QPainter
https://doc.qt.io/qt-5/qpainter.html
а потом эту текстуру и выводить на экран.

void QGLContext::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D)
эта функция рисует текстуру на экран в виде прямоугольника с указаными размерами. как я понял

#4
(Правка: 7:55) 7:53, 19 июля 2021

ИПавлов

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

Это подходит с точками, хотя придется генерить текстуры для всех цветов точек... А что делать с линиями?

#5
(Правка: 9:15) 8:34, 19 июля 2021

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

и да я нашел класс QOpenGLFramebufferObject 
https://doc.qt.io/qt-5/qopenglframebufferobject.html
создаётся. биндится как рендер таргет методом bind(). разбирайся там дальше всё это  нужно будет.

ПрограммированиеФорумГрафика