Qt OpenGL渲染文字问题 QGLWidget

4
我是使用 QGLWidget 和以下代码在屏幕上绘制文本,但如果字符串太长,则渲染效果会非常糟糕:text rendering issue

这是我的代码:

glPushMatrix();
glRotatef(90, 0, 0, 1);
QString qStr = QString("Here's a very long string which doesn't mean anything at all but had some rendering problems");
renderText(0.0, 0.0, 0.0, qStr);
glPopMatrix();

renderText 不是我所知道的任何库中的函数。如果它来自于某个库,请告诉我们是哪一个。如果不是,那么请提供其代码。 - Nicol Bolas
1
请直接编辑我的帖子并附上源代码。 - Thomas Ayoub
renderText() 是 Qt 框架内 OpenGL API 的一部分。你可以根据它接受 QString 作为输入来推断出这一点。 - rbaleksandar
2个回答

3

当我使用 Helvetica 时,也遇到了完全相同的问题。将字体更改为 Arial 就解决了问题。

我写了一个小包装器来使事情变得更加容易:

void _draw_text(double x, double y, double z, QString txt)
{
    glDisable(GL_LIGHTING);
    glDisable(GL_DEPTH_TEST);
    qglColor(Qt::white);
    renderText(x, y, z, txt, QFont("Arial", 12, QFont::Bold, false) );
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
}

0

根据文档:

如果默认的OpenGL绘图引擎是QPaintEngine::OpenGL,则此函数只能在QPainter::beginNativePainting()/QPainter::endNativePainting()块内使用。要使QPaintEngine::OpenGL成为默认的GL引擎,请在QApplication构造函数之前调用QGL::setPreferredPaintEngine(QPaintEngine::OpenGL)。

因此,在调用之前尝试使用QPainter::beginNativePainting(),并在之后使用QPainter::endNativePainting()

另外,请注意,文本是以窗口坐标渲染的,完全不考虑您当前的OpenGL矩阵状态(简而言之,您的glRotatef(90, 0, 0, 1)调用没有任何效果)。您可以在实现here中看到,他们通过调用qt_save_gl_state()保存了您当前的OpenGL状态,然后使用以下代码创建了全新的矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, width, height);
glOrtho(0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

然后绘制文本,最后使用qt_restore_gl_state()恢复先前的OpenGL状态


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接