본문 바로가기
Solution/Qt Programming

[Qt] OpenGL 예제

by 이센 2023. 7. 1.

#1 Qt 에서 OpenGL 사용하기

Qt는 내부적으로 OpenGL을 Wrapping한 "Qt OpenGL" 모듈 을 제공한다. 

이전에 GUI 프로그램밍을 위해서 QWidget 을 사용한 것 처럼, Qt OpenGL 모듈을 이용해서 3D 랜더링을 할 수 있으며, Qt OpenGL 모듈은 QOpenGLWidget Class 와 QGLWidget Class 를 제공한다.

 

Qt 에서 OpenGL 을 사용하기 위해서는 프로젝트 파일에 아래와 같이 명시해야 한다.

QT + opengl

  그리고, 헤더에는 아래와 같이 include 를 사용한다.

#include <QtOPenGL>

#2 QOpenGLWidget

Qt 에서는 3개의 Virtual 함수를 제공한다.

paintGL : QGLWidget 을 업데이트하면 이 함수가 호출된다.

resizeGL : OpenGL 의 viewpoint, project 등을 설정한다. 위젯의 크기가 변경 될 때, 자동으로 호출된다.

initializeGL : OpenGL 렌더링 Context 를 설정한다. paingGL, resizeGL 함수가 호출되기 전, 초기화를 위해 호출된다.

#3 glwidget.h

#include <QtOpenGL>
#include <QOpenGLWidget>
#include <QGLShaderProgram>

class GlWidget : public QOpenGLWidget
{
    Q_OBJECT
public:
    GlWidget(QWidget *parent = 0);
    ~GlWidget();
    QSize sizeHint() const;

protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();

private:
    QMatrix4x4 pMatrix;
    QGLShaderProgram shaderProgram;
    QVector<QVector3D> vertices;
};

#endif // GLWIDGET_H

 

 

#4 glwidget.cpp

QSize GlWidget::sizeHint() const
{
    return QSize(640, 480);
}
void GlWidget::initializeGL()
{
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();

    f->glEnable(GL_DEPTH_TEST);
    f->glEnable(GL_CULL_FACE);
    f->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();

    vertices << QVector3D(1, 0, -2) << QVector3D(0, 1, -2) << QVector3D(-1, 0, -2);
}

 

 

void GlWidget::resizeGL(int width, int height)
{
    if (height == 0) {
        height = 1;
    }

    pMatrix.setToIdentity();
    pMatrix.perspective(60.0, (float)width / (float)height, 0.001, 1000);

    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glViewport(0, 0, width, height);
}

 

 

void GlWidget::paintGL()
{
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();

    f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;

    shaderProgram.bind();

    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);

    shaderProgram.setUniformValue("color", QColor(Qt::white));

    shaderProgram.setAttributeArray("vertex", vertices.constData());
    shaderProgram.enableAttributeArray("vertex");

    f->glDrawArrays(GL_TRIANGLES, 0, vertices.size());

    shaderProgram.disableAttributeArray("vertex");

    shaderProgram.release();
}

위의 방법은 Shader 프로그램을 통해 Opengl 을 사용한 것이고, 다른 방법을 파악 중이다.

https://remocon33.tistory.com/207 

 

[ Qt 프로그래밍 ] OpenGL 로 큐브 만들기

이번에는 Qt로 OpenGL을 이용한 큐브를 만들어보겠습니다.Qt에서 제공하는 OpenGL은 대부분의 기능을 지원합니다.GL.h을 사용하고, glut.h 혹은 glu.h는 사용하지 않습니다.그래서 glut로 시작하는 함수

remocon33.tistory.com