В настоящее время я работаю с 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, или я что-то упустил, или я мог попробовать что-то еще?
После недели попыток я неожиданно нашел очень простой способ достичь того, что искал.
Используя QPainter и это методы вместо QGLWidget renderText()
просто делает обрезку текста:
QPainter *painter = new QPainter();
painter->begin();
painter->setClipping(true);
painter->setClipPath(...); // or
painter->setClipRect(...); // or
painter->setClipRegion(...);
painter->drawText(...);
painter->end();
Насколько я понимаю, это по замыслу. Согласно документации ( 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.