0

I saw a lot of questions how to use OpenGL with shaders and QPainter in parallel on a QOpenGLWidget. For example Example 1, Example 2 and Example 3.

I experienced that there are very many problems, when QPainter, native OpenGL code and shaders are used. Sometimes only the QPainter stuff gets rendered, sometimes only stuff stored in VertexArrayObjects gets rendered or stuff used the "old way" setting vertices with glVertex() gets rendered.

I managed to build a very small solution, which only modifies the usage of QPainter to use every 3 drawing methods in parallel.

The result is, that you can use the QPainter and the shader everywhere in your paintGL()-pipeline of QOpenGLWidget, where you want, without modifying everytime your OpenGL states or start and end nativePainting with your QPainter.

RoQuOTriX
  • 2,871
  • 14
  • 25

1 Answers1

0

So the solution was to create a own QPainter class, called MyPainter which inherits from QPainter.

class MyPainter : public QPainter {

public:
    MyPainter(QPaintDevice* device, ShaderProgram* sp);
    bool end();

private:
    ShaderProgram* shaderProgram;
};

In this class you override the end()-method of QPainter and implement it in the following way:

 MyPainter::MyPainter(QPaintDevice* device, ShaderProgram* sp)
: QPainter(device), shaderProgram(sp) {
}

bool MyPainter::end() {
    beginNativePainting();
    bool b = shaderProgram->bind();
    return b;
}

First you have to beginNativePainting() again, when QPainter ends after drawing something and then you have to bind your current shaderProgram again. Notice that ShaderProgram is in this example an inherited class of QOpenGLShaderProgram.
Now use this MyPainter instead of QPainter in your QOpenGLWidget class in the paintGL() method and everything should work fine way and you can call OpenGL functions and QPainter methods anytime.
This solution was tested with Qt5.9.1, with Visual Studio 2015 and Windows 7.
If something does not work for you, maybe you could provide an example, what does not work and how you use QPainter and OpenGL. I am very interested in a "correct" way of using QPainter and OpenGL in parallel.

RoQuOTriX
  • 2,871
  • 14
  • 25