Qt OpenGL渲染文字
阿新 • • 發佈:2019-01-24
看本文章的人我相信都不需要我介紹Qt和OpenGL了。文字的繪製一直都是3D開發的一個難題,本文將介紹一種非常簡單,效率也還可以的方法來渲染文字到OpenGL。
先講原理,Qt的QPainter擁有將內容繪製到QImage裝置的能力,也就是直接會知道文字,因此,可以通過QPainter的drawText方法將文字繪製到一張Image,再建立成紋理,渲染到OpenGL目標中。
先給一個效果圖:
從文字建立紋理的方法如下:
QOpenGLTexture *GLWindow::genTexture(int width, int height, const QString &text, int textPixelSize, const QColor &textColor)
{
QOpenGLTexture *texture = new QOpenGLTexture(QOpenGLTexture::Target2D);
QImage img(width, height, QImage::Format_ARGB32_Premultiplied);//img是圖片,模式為 QImage::Format_ARGB32_Premultiplied是因為按官方的說法,這個模式快。
img.fill(QColor(0, 0, 0, 0));//填充為透明 QPainter painter; QFont font; painter.begin(&img); font.setPixelSize(textPixelSize); painter.setFont(font); QPen pen; pen.setColor(textColor); painter.setPen(pen); QTextOption option(Qt::AlignLeft | Qt::AlignTop);//這裡使文字繪製時自動換行 option.setWrapMode(QTextOption::WordWrap); QRectF rect(0, 0, width, height); painter.drawText(rect, text, option);//繪製到圖片 painter.end(); //建立為紋理。 texture->setData(img); // texture->setMipLevelRange(0, mipLevelMax);//off mipmap 沒必要,開了影響效果 texture->setMinificationFilter(QOpenGLTexture::Linear);//線性濾波方式,文字看上去柔和 texture->setMagnificationFilter(QOpenGLTexture::Linear); texture->setWrapMode(QOpenGLTexture::Repeat); return texture; }
最終將紋理繫結到渲染目標即可。
demo嘗試了一個60fps的渲染,且每一幀都會重新建立一個紋理,效率上還是可以的。
原始碼及文章所有權歸作者所有,轉載請註明出處。