我看到了很多问题,如何在QOpenGLWidget
上并行使用带有着色器和glVertex()
的OpenGL。例如Example 1,Example 2和Example 3。
当使用QPainter,本机OpenGL代码和着色器时,我遇到了很多问题。有时仅渲染QPainter内容,有时仅渲染存储在VertexArrayObjects中的内容,或者渲染使用QPainter
的“旧方法”设置顶点的内容。
我设法建立了一个非常小的解决方案,该解决方案仅修改了QPainter
的用法,以并行使用每3种绘制方法。
结果是,您可以在paintGL()
的{{1}}管道中的任意位置使用QOpenGLWidget
和着色器,而无需在每次OpenGL状态或启动和运行时都进行修改用您的QPainter
结束nativePainting。
答案 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的“正确”方式非常感兴趣。