Мультисэмплинг с использованием Qt
Некоторое время я пытался включить мультисэмплинг в QGLWidget, чтобы сгладить края кубоидов, которые я рендерил, но безуспешно. Вот части кода, которые делают работу.
1) Я передаю указанный формат конструктору GLWidget (который наследует QGLWidget), чтобы включить мультисэмплинг и установить количество выборок.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGLFormat glFormat;
glFormat.setSampleBuffers(true);
glFormat.setSamples(4);
widget = new GLWidget(glFormat, ui->centralWidget);
widget->setObjectName(QStringLiteral("widget"));
ui->horizontalLayout->addWidget(widget);
}
GLWidget *widget является членом класса mainwindow.
2) Я включаю мультисэмплинг в методе initializeGL() и проверяю, работает ли мультисэмплинг
void GLWidget::initializeGL()
{
glClearColor(0,0,0,0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_MULTISAMPLE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_NORMALIZE);
GLint bufs;
GLint samples;
glGetIntegerv(GL_SAMPLE_BUFFERS, &bufs);
glGetIntegerv(GL_SAMPLES, &samples);
qDebug("Have %d buffers and %d samples", bufs, samples);
}
Даже если для setSamples установлено значение 4 qDebug
Have 1 buffers and 8 samples
На самом деле ничего не происходит, кубоиды по-прежнему имеют неровные края, линии тоже не гладкие
3) Вот как визуализируются кубоиды
void GLWidget::placeBox(Dimension d, Position p)
{
Position normal, v1, v2;
glColor3f(1, 0, 0);
glLineWidth(1.5);
glBegin(GL_LINE_LOOP);
glVertex3f(p.x, p.y, p.z);
glVertex3f(p.x, p.y+d.h, p.z);
glVertex3f(p.x, p.y+d.h, p.z+d.w);
glVertex3f(p.x, p.y, p.z+d.w);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(p.x+d.l, p.y, p.z);
glVertex3f(p.x+d.l, p.y+d.h, p.z);
glVertex3f(p.x+d.l, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z+d.w);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(p.x, p.y+d.h, p.z);
glVertex3f(p.x, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y+d.h, p.z);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(p.x, p.y, p.z);
glVertex3f(p.x, p.y, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(p.x, p.y, p.z+d.w);
glVertex3f(p.x, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z+d.w);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(p.x, p.y, p.z);
glVertex3f(p.x, p.y+d.h, p.z);
glVertex3f(p.x+d.l, p.y+d.h, p.z);
glVertex3f(p.x+d.l, p.y, p.z);
glEnd();
// N = cross( (V1 = gl - gd), (V2 = dl - gd) )
glColor3f(1, 1, 1);
glBegin(GL_QUADS);
v1 = {0, 0, -d.w};
v2 = {0, -d.h, -d.w};
normal = crossProduct(v1,v2);
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(p.x, p.y, p.z);
glVertex3f(p.x, p.y+d.h, p.z);
glVertex3f(p.x, p.y+d.h, p.z+d.w);
glVertex3f(p.x, p.y, p.z+d.w);
v1 = {0, 0, d.w};
v2 = {0,-d.h, d.w};
normal = crossProduct(v1,v2);
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(p.x+d.l, p.y, p.z);
glVertex3f(p.x+d.l, p.y+d.h, p.z);
glVertex3f(p.x+d.l, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z+d.w);
v1 = {-d.l, 0, 0};
v2 = {0, 0, d.w};
normal = crossProduct(v1,v2);
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(p.x, p.y+d.h, p.z);
glVertex3f(p.x, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y+d.h, p.z);
v1 = {d.l, 0, 0};
v2 = {d.l, 0, d.w};
normal = crossProduct(v1,v2);
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(p.x, p.y, p.z);
glVertex3f(p.x, p.y, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z);
v1 = {-d.l, 0, 0};
v2 = {-d.l, -d.h, 0};
normal = crossProduct(v1, v2);
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(p.x, p.y, p.z+d.w);
glVertex3f(p.x, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y+d.h, p.z+d.w);
glVertex3f(p.x+d.l, p.y, p.z+d.w);
v1 = {d.l, 0, 0};
v2 = {d.l, -d.h, 0};
normal = crossProduct(v1, v2);
glNormal3f(normal.x, normal.y, normal.z);
glVertex3f(p.x, p.y, p.z);
glVertex3f(p.x, p.y+d.h, p.z);
glVertex3f(p.x+d.l, p.y+d.h, p.z);
glVertex3f(p.x+d.l, p.y, p.z);
glEnd();
}
GL_LINE_LOOP используется для создания рамок вокруг кубоидов и GL_QUADS для граней кубов
Я работаю под Linux Mint, используя Radeon HD 7790.