如何在 QOpenGLTexture 上渲染文本?

Posted

技术标签:

【中文标题】如何在 QOpenGLTexture 上渲染文本?【英文标题】:How to render text over the QOpenGLTexture? 【发布时间】:2020-01-15 14:00:51 【问题描述】:

所以我的任务是在 QOpenGLWidget 的纹理上渲染一些文本。 我对文本使用简单的glutBitmapCharacter,它在没有纹理的情况下也能正常工作,但是当我在这样的文本之前添加纹理时:

// in initializeGL
QOpenGLTexture t = new QOenGLTexture(img);
t->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
t->setMagnificationFilter(QOpenGLTexture::Linear);

// in printGL
t->bind();
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2i(0, 0);
glTexCoord2f(0, 1); glVertex2i(0, 255);
glTexCoord2f(1, 1); glVertex2i(255, 255);
glTexCoord2f(1, 0); glVertex2i(255, 0);
glEnd();

...它开始向我显示没有任何文字的纹理。 我需要在使用后以某种方式取消绑定纹理吗?

【问题讨论】:

我尝试使用release 方法,但没有帮助 【参考方案1】:

必须启用二维纹理,请参阅glEnable

glEnable(GL_TEXTURE_2D);

如果启用纹理,则默认情况下纹理元素的颜色乘以当前颜色,因为默认情况下纹理环境模式 (GL_TEXTURE_ENV_MODE) 为GL_MODULATE。见glTexEnv

这会导致纹理纹理像素的颜色与您设置的最后一个颜色“混合”glColor

在渲染纹理之前设置“白色”颜色,以解决您的问题:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

绘制四边形后禁用二维纹理:

glEnable(GL_TEXTURE_2D);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2i(0, 0);
glTexCoord2f(0, 1); glVertex2i(0, 255);
glTexCoord2f(1, 1); glVertex2i(255, 255);
glTexCoord2f(1, 0); glVertex2i(255, 0);
glEnd();

glDisable(GL_TEXTURE_2D);

【讨论】:

所以我按照你说的做了,但仍然只有一个纹理 已修复!好像有2个问题。你帮助我的第一个。第二个,文本坐标在纹理中。我只是将它们移近一点,然后再靠近纹理。感谢您的帮助!

以上是关于如何在 QOpenGLTexture 上渲染文本?的主要内容,如果未能解决你的问题,请参考以下文章

调整 QOpenGLTexture 保留属性的大小

如何在渲染后更改后退按钮上的文本

glTexSubImage3D vs QOpenGLTexture setData

有没有办法确定 OpenGL 纹理或 QOpenGLTexture 的图形内存占用?

QOpenGLTexture::allocateStorage 导致 GL_INVALID_VALUE 错误

在pygame中的透明表面上渲染抗锯齿文本