2

しばらくの間、レンダリングする立方体の端を滑らかにするために 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 は直方体の面に使用されます

Radeon HD 7790 を使用して、Linux Mint で作業しています。

4

0 に答える 0