Обрезка текста с помощью Qt OpenGL

В настоящее время я работаю с Qt5.1 и пытаюсь нарисовать некоторые вещи OpenGL в QGLWidget:

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, или я что-то упустил, или я мог попробовать что-то еще?

3

Решение

После недели попыток я неожиданно нашел очень простой способ достичь того, что искал.
Используя 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 ):


Note: This function clears the stencil buffer.
Note: This function temporarily disables depth-testing when the text is drawn.

Однако для «версии XYZ» (перегруженная функция)


Note: If depth testing is enabled before this function is called, then the drawn text will be depth-tested against the models that have already been drawn in the scene. Use glDisable(GL_DEPTH_TEST) before calling this function to annotate the models without depth-testing the text.

Так что, если вы используете в своем исходном коде вторую версию (включив z-значение, например 0), я думаю, вы получите то, что хотите. Я думаю, вы захотите сделать это, если вы создадите сцену, которая является «настоящим» 3D (например, метки осей на трехмерном графике).

В документации также упоминается использование drawText.

0

По вопросам рекламы [email protected]