用于渲染 2D 文本的 paintGL() 中的着色器和 QPainter 之间的冲突

Posted

技术标签:

【中文标题】用于渲染 2D 文本的 paintGL() 中的着色器和 QPainter 之间的冲突【英文标题】:Conflict between shaders and QPainter in paintGL() for rendering 2D text 【发布时间】:2016-12-06 10:39:56 【问题描述】:

我有以下类继承自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 轴:

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

一个好的输出应该是:

以“Hello World”为中心。这是我在评论QPainter 电话时得到的。

【问题讨论】:

抱歉,“好的”输出应该是什么样的? 查看更新后的帖子。 如果在自定义 GL 绘制代码之后创建 QPainter 会发生什么? 同样的问题。我仍然需要使用封闭的画家函数beginNativePaintingbeginNativePainting 来包装自定义的 GL 绘制代码。但即使没有它们,它也不会画出任何东西。 我会建议在 apitrace 中运行应用程序并检查是否有一些混乱的 GL 状态。 【参考方案1】:

您的着色器程序似乎是在您使用 QPainter 时发布的。在 OpenGL 调用之前绑定着色器程序并在之后释放它。它应该修复它。

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();

【讨论】:

以上是关于用于渲染 2D 文本的 paintGL() 中的着色器和 QPainter 之间的冲突的主要内容,如果未能解决你的问题,请参考以下文章

基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

Direct2D - 如何绘制尽可能接近 GDI 渲染的文本

OpenGL高度图地形渲染不绘制

为啥 DirectX/DirectWrite/Direct2D 文本渲染不能像 GDI 一样清晰?

Qt 5.5 和 OpenGL:尝试调用 paintGL() 时引发读取访问冲突异常

使用 2D 和 3D 上下文的画布 3D 绘图