#include "OpenGlViewer.h" #include "defines.h" #include "Vertex.h" #include static const Vertex sg_vertexes[] = { Vertex(QVector3D(0.00f, 0.75f, 1.0f), QVector3D(1.0f, 0.0f, 0.0f)), Vertex(QVector3D(0.75f, -0.75f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f)), Vertex(QVector3D(-0.75f, -0.75f, 1.0f), QVector3D(0.0f, 0.0f, 1.0f)) }; OpenGlViewer::OpenGlViewer(QWidget *parent) : QOpenGLWidget(parent) { QSurfaceFormat format; format.setRenderableType(QSurfaceFormat::OpenGL); format.setProfile(QSurfaceFormat::CompatibilityProfile); format.setVersion(DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION); setFormat(format); } OpenGlViewer::~OpenGlViewer() { mVertexArray.destroy(); mVertexBuffer.destroy(); delete mProgram; } void OpenGlViewer::printContextInformation() { QString glType; QString glVersion; QString glProfile; glType = (context()->isOpenGLES()) ? "OpenGL ES" : "OpenGL"; glVersion = reinterpret_cast(glGetString(GL_VERSION)); #define CASE(c) case QSurfaceFormat::c: glProfile = #c; break switch (format().profile()) { CASE(NoProfile); CASE(CoreProfile); CASE(CompatibilityProfile); } #undef CASE std::cout << glType.toStdString() << " - " << glVersion.toStdString() << " (" << glProfile.toStdString() << ")"; } void OpenGlViewer::initializeGL() { initializeOpenGLFunctions(); printContextInformation(); //glEnable(GL_DEPTH_TEST); glClearColor(DEAFAULT_BACKGROUND); mProgram = new QOpenGLShaderProgram(); mProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/simple.vert"); mProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/simple.frag"); mProgram->link(); mProgram->bind(); mVertexBuffer.create(); mVertexBuffer.bind(); mVertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw); mVertexBuffer.allocate(sg_vertexes, sizeof(sg_vertexes)); mVertexArray.create(); mVertexArray.bind(); mProgram->enableAttributeArray(0); mProgram->enableAttributeArray(1); mProgram->setAttributeBuffer(0, GL_FLOAT, Vertex::positionOffset(), Vertex::PositionTupleSize, Vertex::stride()); mProgram->setAttributeBuffer(1, GL_FLOAT, Vertex::colorOffset(), Vertex::ColorTupleSize, Vertex::stride()); mVertexArray.release(); mVertexBuffer.release(); mProgram->release(); } void OpenGlViewer::resizeGL(int w, int h) { //TODO: change perspective } void OpenGlViewer::paintGL() { //TODO: paint here glClear(GL_COLOR_BUFFER_BIT); mProgram->bind(); mVertexArray.bind(); glDrawArrays(GL_TRIANGLES, 0, sizeof(sg_vertexes) / sizeof(sg_vertexes[0])); mVertexArray.release(); mProgram->release(); }