@Christian-Ehrlicher Thanks a lot! You are right! I forgot to activate (bind) the program in paintGL():
void paintGL() override
{
m_program.bind();
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 4);
}
[image: 69d1a505-0c96-4e98-b236-54dc8cdf047f.png]
pro
QT += core gui openglwidgets widgets
win32: LIBS += -lopengl32
CONFIG += c++17
SOURCES += \
main.cpp
main.cpp
#include <QtGui/QOpenGLFunctions>
#include <QtGui/QSurfaceFormat>
#include <QtOpenGLWidgets/QOpenGLWidget>
#include <QtOpenGL/QOpenGLBuffer>
#include <QtOpenGL/QOpenGLShaderProgram>
#include <QtWidgets/QApplication>
class OpenGLWidget : public QOpenGLWidget, private QOpenGLFunctions
{
public:
OpenGLWidget()
{
resize(350, 350);
setWindowTitle("OpenGL Triangle");
}
private:
void initializeGL() override
{
initializeOpenGLFunctions();
glClearColor(0.4f, 0.8f, 0.9f, 1.f);
qDebug() << "OpenGL Version:" << (const char*) glGetString(GL_VERSION);
qDebug() << "GLSL Version:" << (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION);
qDebug() << "OpenGL Vendor:" << (const char*) glGetString(GL_VENDOR);
QString vertexShaderSource =
"attribute vec2 aPosition;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPosition, 0.0, 1.0);\n"
"}\n";
QString fragmentShaderSource =
"#ifdef GL_ES\n"
"precision mediump float;\n"
"#endif\n"
"//out vec4 fragColor;\n"
"void main()\n"
"{\n"
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
m_program.create();
m_program.addShaderFromSourceCode(QOpenGLShader::ShaderTypeBit::Vertex,
vertexShaderSource);
m_program.addShaderFromSourceCode(QOpenGLShader::ShaderTypeBit::Fragment,
fragmentShaderSource);
m_program.link();
m_program.bind();
float vertPositions[] = {
-0.5f, -0.5f,
0.5f, -0.5f,
0.f, 0.5f
};
m_vertPosBuffer.create();
m_vertPosBuffer.bind();
m_vertPosBuffer.allocate(vertPositions, sizeof(vertPositions));
m_program.setAttributeBuffer("aPosition", GL_FLOAT, 0, 2);
m_program.enableAttributeArray("aPosition");
}
void paintGL() override
{
m_program.bind();
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 4);
}
private:
QOpenGLShaderProgram m_program;
QOpenGLBuffer m_vertPosBuffer;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
OpenGLWidget w;
w.show();
return app.exec();
}