#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
'Solution > Qt Programming' 카테고리의 다른 글
[Qt] Rotating Teapot in MDI Window (0) | 2023.08.26 |
---|---|
[Qt] Drawing a triangle in a sub-window with Open-GL (0) | 2023.08.05 |
[Qt] Window에서 QGLWidget 기반 OpenGL 적용 (0) | 2023.08.04 |
[Qt] Signal, Slot, and Connect (0) | 2023.07.22 |
Qt 에서 Dial 구현 (0) | 2023.06.23 |