如何在QGLWidget中设置alpha混合GL_TEXTURE_2D的颜色

时间:2013-09-07 20:49:15

标签: qt opengl

我是在Opengl中使用混合和纹理的新手。我的render_text()方法使用QPainter中的drawText方法,并将QImage作为其设备。 QImage变为GL_TEXTURE_2D,然后附加到GL_QUADS。文本在2D场景中正确显示为黑色。我想知道如何随意设置颜色。如果有人可以推荐一个关于源到目标混合工作如何也会受益的好教程。

void GLView::render_text(char *txt, quint8 height)
{
    QImage image;
    qint32 font_height, width;

    font_height = height * VIEW_SIZE / (ZOOM * OBJ_HEIGHT);

    QFont font("Helvetica", font_height);
    QFontMetrics fm(font);

    // render text in QImage
    QImage img(fm.width(txt), fm.height(), QImage::Format_ARGB32);
    img.fill(0);
    QPainter pixPaint(&img);
    pixPaint.setFont(font);
    pixPaint.drawText(0, font_height, txt);

    // push to gl
    image = QGLWidget::convertToGLFormat(img);

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    //glBlendColor(1, 0, 0, 0.5);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );

    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.width(), image.height(), GL_RGBA, GL_UNSIGNED_BYTE, image.bits() );

    width = image.width() * ZOOM * OBJ_WIDTH / VIEW_SIZE;       //calc object width from image width

    glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex2f(0, 0);
    glTexCoord2i(0,1); glVertex2f(0, height);
    glTexCoord2i(1,1); glVertex2f(width, height);
    glTexCoord2i(1,0); glVertex2f(width, 0);
    glEnd();

    glDisable(GL_TEXTURE_2D);
    glDisable(GL_BLEND);
    glDeleteTextures(1, &texture);
}

1 个答案:

答案 0 :(得分:1)

  1. 您可以首先使用正确的颜色进行绘制 - 在QPainter对象/ QPen上设置颜色!

  2. 我建议您使用QGLFrameBufferObject吗?您可以使用QPainter绘制它,然后在GL代码中使用Qt调用将其绘制为纹理。优点:

    • Qt将使用OpenGL渲染文本
    • 无需复制到GPU。
    • =>快得多!