我有以下类继承自 QOpenGLWidgetQOpenGLFunctions :

class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    OpenGLWidget();
    virtual ~OpenGLWidget();

    void initializeGL();
    void paintGL()
    {
       QPainter painter(this);

       painter.beginNativePainting();
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       // Calls OpenGL draw functions with VBOs
       m_viewport.render(m_shader, m_entities);
       painter.endNativePainting();

       painter.drawText(0, 0, width(), height(), Qt::AlignCenter, "Hello World!");

    }
    void resizeGL(int width, int height);

    [...]
}

“Hello World”按预期绘制,但 3D 场景损坏。我应该在屏幕的中心和右上角有 3D 轴:

qt - 用于渲染二维文本的paintGL() 中着色器和QPainter 之间的冲突-LMLPHP

对我来说,我使用的顶点和片段着色器似乎是问题的根源。否则,鉴于代码的简单性和我找到的示例,它应该可以工作。

一个好的输出是:

qt - 用于渲染二维文本的paintGL() 中着色器和QPainter 之间的冲突-LMLPHP

以“Hello World”为中心。这就是我评论 QPainter 调用时得到的结果。

最佳答案

看来你的shader程序是在你使用QPainter的时候发布的。在 OpenGL 调用之前绑定(bind)着色器程序并在之后释放它。它应该修复它。

painter.beginNativePainting();
// Bind shader program
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Calls OpenGL draw functions with VBOs
m_viewport.render(m_shader, m_entities);
// Release shader program
painter.endNativePainting();

关于qt - 用于渲染二维文本的paintGL() 中着色器和QPainter 之间的冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40993333/

10-15 09:31