用于渲染 2D 文本的 paintGL() 中着色器和 QPainter 之间的冲突
Conflict between shaders and QPainter in paintGL() for rendering 2D text
我从 QOpenGLWidget
和 QOpenGLFunctions
继承了以下 class:
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
调用时得到的结果。
看来你的shader程序是在你使用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();
我从 QOpenGLWidget
和 QOpenGLFunctions
继承了以下 class:
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
调用时得到的结果。
看来你的shader程序是在你使用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();