关于QOpenGLWidget上显示文本的方法

imz2y 2023-06-01 11:49:07

本文是笔者关于QOpenGLWidget显示文本的笔记。方法在网上都可以找到。不当之处欢迎指正!

类别一、显示2D文本

该方式为将文本内容显示在QOpenGLWidget上,不随视角变化。
应用:3D场景的图例或内容描述。
优点:相对于在其他部位显示优点是截图时带着文本内容。
缺点:QPainter内容不被消隐,不适合显示面片信息
方法:在OpenGL中混合QPainter命令。这部分教程比较多,可以在网上搜。

类别二、显示3D文本

该方式为将文本内容显示在QOpenGLWidget中的面片上,需要随视角变化,支持消隐。

图片方式

用QPainter 将显示的字符串写在QImage上,背景透明。然后将QImage当做材质贴在一个多边形上。
优点:文本美观,支持各种字体。
缺点:1.多边形边界的计算比较麻烦,影响贴图质量。
2.生成的图片文件不能太大,否则申请数组会出问题。

QImage* COPenGLText::Text2Image(GLuint ID)
{
QSize size(m_width32/m_height,32 ); // m_width,m_height 字符串宽高要先算好,生成高为32点的图片
QImage
imgDraw = new QImage(size, QImage::Format_ARGB32);
imgDraw->fill(Qt::transparent);
QPainter* painter = new QPainter(imgDraw);
painter->setRenderHint(QPainter::Antialiasing, true); // 反走样
painter->setBackgroundMode(Qt::TransparentMode); // 背景透明,影响到text
painter->begin(m_Parent);
painter->setPen(getColor()); // 文字颜色
QFont txFont(csFont, 32.);
painter->setFont(txFont);
painter->drawText(1, 31, text); // 字高小一点,避免缺失内容
painter->end();
return imgDraw;

QPainterPath方式:

将文本写在QPainterPath上,然后得到多边形,最后在OpenGL中绘制多边形的线框。
优点:代码量小,内存消耗小。
缺点:1.QPainterPath内有圆弧和曲线,用直线代替精度低,可以先离散曲线再绘制。
2.需要填充的话需要添加大量代码,如多边形包含计算,三角化等。
综合评价,我选择用QPainterPath的线框方式。
部分代码如下:

      。。。  先生成文本的变换矩阵,依据,绕三个轴的转角以及参考点坐标。
      QPainterPath path;            
        glDisable(GL_LIGHTING);

        QFont font(csFont, zh);
        path.addText(QPointF(0, 0), font, text);
        QList<QPolygonF> poly = path.toSubpathPolygons();
            
        for (QList<QPolygonF>::iterator i = poly.begin(); i != poly.end(); i++) {

// glBegin(GL_LINE_LOOP);
glBegin(GL_POLYGON);

            glColor3f(aText.rgb[0]/256., aText.rgb[1] / 256., aText.rgb[2] / 256.);
            for (QPolygonF::iterator p = (*i).begin(); p != (*i).end(); p++)
            {
                double x3,y3, z3;
                aText.Local2Word(p->rx(), zh -p->ry(), x3, y3, z3);  // 坐标转换
                glVertex3f(x3, y3, z3);
            }                                    
            glEnd();
        }
        glEnable(GL_LIGHTING);
...全文
405 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码链接: https://pan.quark.cn/s/05b63cfa5283 在信息技术领域,特别是在图形程序设计方面,Qt与OpenGL被视为两个核心的实用工具。Qt作为一个跨操作系统的C++框架,主要应用于构建用户交互界面以及桌面程序,而OpenGL则是一个功能强大的图形接口,为开发者提供了执行高效二维和三维图形渲染的能力。本材料将详细研究在Qt框架内运用OpenGL进行文字呈现、透视映射、材质映射及抗走样处理的技术。现在让我们聚焦于“QtOpenGL文字呈现”这一专题。在OpenGL中,为了实现文本的展示,通常需要借助额外的库如FreeType或GLUT,因为OpenGL本身并不具备直接处理文本渲染的功能。在Qt环境下,我们可以借助QOpenGLWidget以及Qt的字体管理系统来达成文字与OpenGL的融合。QOpenGLWidget是Qt提供的一种专门用于OpenGL图形渲染的窗口组件,开发者可以在其paintEvent()函数中执行OpenGL的绘图操作。同时,通过QFont和QFontMetrics来管理文本的布局和尺寸,随后利用OpenGL的顶点数组和顶点着色器将字符转化为几何体并呈现到屏幕上。随后,我们将探讨“透视映射”。在三维图形领域中,透视映射能够模拟人类视觉感知物体的方式,使得靠近的物体显得更大,远离的物体显得更小,从而营造深度效果。在OpenGL中,可以使用gluPerspective函数来设定透视映射矩阵,或者采用更为现代的矩阵操作库比如glm,手动计算并设定透视映射矩阵。这一过程通常在初始化OpenGL环境之后,在渲染循环开始之前完成。接下来,我们讨论“材质映射”。材质映射是一种将二维图像(即纹理)应用至三维模型表面的技术...

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧