如何将QPainter和OpenGL与着色器与Qt5.9并行使用

时间:2019-04-11 08:46:02

标签: c++ qt opengl

我看到了很多问题,如何在QOpenGLWidget上并行使用带有着色器和glVertex()的OpenGL。例如Example 1Example 2Example 3

当使用QPainter,本机OpenGL代码和着色器时,我遇到了很多问题。有时仅渲染QPainter内容,有时仅渲染存储在VertexArrayObjects中的内容,或者渲染使用QPainter的“旧方法”设置顶点的内容。

我设法建立了一个非常小的解决方案,该解决方案仅修改了QPainter的用法,以并行使用每3种绘制方法。

结果是,您可以在paintGL()的{​​{1}}管道中的任意位置使用QOpenGLWidget和着色器,而无需在每次OpenGL状态或启动和运行时都进行修改用您的QPainter结束nativePainting。

1 个答案:

答案 0 :(得分:0)

因此解决方案是创建一个自己的QPainter类,称为MyPainter,该类继承自QPainter

class MyPainter : public QPainter {

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

private:
    ShaderProgram* shaderProgram;
};

在此类中,您将覆盖end的{​​{1}}()方法并以以下方式实现它:

QPainter

首先,您必须再次 MyPainter::MyPainter(QPaintDevice* device, ShaderProgram* sp) : QPainter(device), shaderProgram(sp) { } bool MyPainter::end() { beginNativePainting(); bool b = shaderProgram->bind(); return b; } ,当beginNativePainting()在绘制某些内容后结束时,然后必须再次绑定当前的shaderProgram。请注意,在此示例中,QPainter是QOpenGLShaderProgram的继承类。
现在,在ShaderProgram方法的MyPainter类中使用此QPainter而不是QOpenGLWidget,一切应该可以正常工作,并且可以调用OpenGL函数和paintGL()方法随时。
此解决方案已通过Qt5.9.1,Visual Studio 2015和Windows 7进行了测试。
如果有些问题对您不起作用,也许您可​​以提供一个示例,哪些不起作用以及如何使用QPainter和OpenGL。我对并行使用QPainter和OpenGL的“正确”方式非常感兴趣。