1. 程式人生 > >Qt OpenGL渲染文字

Qt OpenGL渲染文字

看本文章的人我相信都不需要我介紹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的渲染,且每一幀都會重新建立一個紋理,效率上還是可以的。

原始碼及文章所有權歸作者所有,轉載請註明出處。