使用Qt OpenGL进行文本裁剪

3

我目前使用的是Qt5.1,并尝试在QGLWidget中绘制一些OpenGL内容:

void Widget::paintGL() {
    startClipping(10, height()-110,100,100);

    qglColor(Qt::red);
    glBegin(GL_QUADS);
        glVertex2d(0,0);
        glVertex2d(500,0);
        glVertex2d(500,500);
        glVertex2d(0,500);
    glEnd();

    qglColor(Qt::green);
    this->renderText(50, 50, "SCISSOR TEST STRING");

    endClipping();
}

四边形被正确地裁剪,但文本没有被裁剪。我尝试了三种实现startClipping方法的方式:剪刀测试、将视口设置为裁剪区域和使用模板缓冲区。但是这些方法都没有奏效,整个字符串都被绘制出来,而不是在裁剪区域的边缘被截断。

现在我的问题是:这种行为是Qt的一个bug还是有我忽略的东西或者我可以尝试的其他可能性?

2个回答

0
经过一周的尝试,我突然发现了一个非常简单的方法来实现我一直在寻找的功能。使用QPainter及其方法,而不是QGLWidget的renderText(),可以使文本剪切正常工作。
QPainter *painter = new QPainter();
painter->begin();

painter->setClipping(true);

painter->setClipPath(...);   // or
painter->setClipRect(...);   // or
painter->setClipRegion(...);

painter->drawText(...);

painter->end();

0

据我所知,这是设计上的。根据文档(https://qt-project.org/doc/qt-4.8/qglwidget.html#renderText):

注意:此函数会清除模板缓冲区。
注意:当绘制文本时,此函数会暂时禁用深度测试。

然而对于'xyz版本'(重载函数)

注意:如果在调用此函数之前启用了深度测试,则绘制的文本将与已在场景中绘制的模型进行深度测试。在调用此函数之前使用glDisable(GL_DEPTH_TEST)来注释模型,而不对文本进行深度测试。

因此,如果您在原始代码中使用第二个版本(包括z值,例如0),我认为您会得到想要的结果。如果您做一个“真正”的3D场景(例如,在3D图中的轴标签),我认为您会想这样做。

文档还提到了使用drawText。


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