使用Qt的多采样

使用Qt的多采样,qt,opengl,antialiasing,multisampling,Qt,Opengl,Antialiasing,Multisampling,有一段时间,我试图在QGLWidget上启用多重采样,以便平滑我渲染的长方体的结尾,但没有成功。下面是完成这项工作的代码部分 1) 我将一个指定的格式传递给GLWidget的构造函数(它继承了QGLWidget),以便启用多重采样并设置样本数 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QGLFormat glF

有一段时间,我试图在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*小部件是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_四边形创建框架


我在Linux Mint下工作,使用Radeon HD 7790。

8x MSAA是台式机AMD GPU在非CrossFire配置中的最大支持。我的印象是,在某个地方,您的系统被配置为覆盖应用程序设置,并从一开始就使用最高的MSAA级别。其中一种设置允许您在应用程序请求任何MSAA时使用8x MSAA,在未请求任何MSAA时完全禁用MSAA(我相信Catalyst Control Center称之为“增强应用程序设置”)。是否可以使用以下选项打印请求像素格式的结果:1。没有MSAA,2。2x MSAA?@Andon M.Coleman我在catalyst control center中配置了设置,并知道缓冲区的数量和样本数量与QGLFormat相对应。但最重要的是,我在我的场景中没有看到任何抗锯齿,线条和四边形仍然参差不齐。我切换到windows,多重采样工作正常,看起来问题在于linux mint上的图形卡驱动程序。