Qt 如何在QGLWidget中设置alpha混合GL_纹理_2D的颜色

Qt 如何在QGLWidget中设置alpha混合GL_纹理_2D的颜色,qt,opengl,Qt,Opengl,我是Opengl中混合和纹理的新手。My render_text()方法使用QPaint中的drawText方法,并将QImage作为其设备。QImage将成为GL_纹理_2D,然后附着到GL_四边形。文本在2d场景上正确显示为黑色。我想知道如何任意设置颜色。如果有人能推荐一个关于源到目标混合工作原理的好教程,也会受益匪浅 void GLView::render_text(char *txt, quint8 height) { QImage image; qint32 font_

我是Opengl中混合和纹理的新手。My render_text()方法使用QPaint中的drawText方法,并将QImage作为其设备。QImage将成为GL_纹理_2D,然后附着到GL_四边形。文本在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);
}
  • 首先可以使用正确的颜色进行绘制--在
    QPainter
    对象上设置颜色/
    QPen

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

    • Qt将使用OpenGL渲染文本
    • 不需要复制到GPU
    • =>快多了
  • 首先可以使用正确的颜色进行绘制--在
    QPainter
    对象上设置颜色/
    QPen

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

    • Qt将使用OpenGL渲染文本
    • 不需要复制到GPU
    • =>快多了

  • 很明显,首先可以使用正确的颜色进行绘制——在QPaint对象上设置颜色!我可以建议您使用QGLFrameBufferObject吗?您可以使用QPaint绘制它,然后在GL代码中使用Qt调用将其绘制为纹理。优点:1。Qt将使用OpenGL渲染文本,2。不需要复制到GPU。结论:快多了!是的,用QPen作品设置颜色。我以前试过使用QPen,但没有成功,一定是出了什么问题。明天我将尝试QGLFrameBufferObject。谢谢很明显,首先可以使用正确的颜色进行绘制——在QPaint对象上设置颜色!我可以建议您使用QGLFrameBufferObject吗?您可以使用QPaint绘制它,然后在GL代码中使用Qt调用将其绘制为纹理。优点:1。Qt将使用OpenGL渲染文本,2。不需要复制到GPU。结论:快多了!是的,用QPen作品设置颜色。我以前试过使用QPen,但没有成功,一定是出了什么问题。明天我将尝试QGLFrameBufferObject。谢谢我必须画笔。setColor(QColor(255255));然后我可以使用glColor3ub()将颜色设置为我想要的颜色。仍在尝试绘制QGLFrameBufferObject。
    QGLFrameBufferObject fbo(fm.width(txt)、fm.height()、QGLFrameBufferObject::CombinedDephstencil);QPainter pixPaint(和fbo)给出“QGLShader:无法创建着色器”确保在创建FBO并对其进行绘制时具有GL上下文。这意味着您只需要在创建上下文之后创建它,然后还要确保您拥有上下文。我使用QGLWidget绘制GL内容,并在小部件中创建FBO。使用QGLWidget::makeCurrent();我强制执行GL上下文。在QGLWidget::paintEvent()中,始终具有GL上下文。render_text方法在glNewList和glEndList之间调用。在GLView::paintGL()中调用该列表。通过将render_text调用移动到GLView::paintGL()中,我不再获得“无法创建shaderMoving”。问题是,我正在使用translate in GLView::paintGL()滚动GL查看区域,在缩放之前我不希望重新绘制文本。首先,您可以随时(在上下文中)创建FBO,并保留它,并随时在其中绘制。所以你不需要在你画的位置准备它。其次,在显示列表创建中执行此操作可能是违反GL的。FBO不在显示列表的范围内。第三,顶点数组/顶点缓冲区对象(QGLBuffer)不推荐使用显示列表。但你仍然可以使用它们。我只是说,我必须画笔。setColor(QColor(255255));然后我可以使用glColor3ub()将颜色设置为我想要的颜色。仍在尝试绘制QGLFrameBufferObject。
    QGLFrameBufferObject fbo(fm.width(txt)、fm.height()、QGLFrameBufferObject::CombinedDephstencil);QPainter pixPaint(和fbo)给出“QGLShader:无法创建着色器”确保在创建FBO并对其进行绘制时具有GL上下文。这意味着您只需要在创建上下文之后创建它,然后还要确保您拥有上下文。我使用QGLWidget绘制GL内容,并在小部件中创建FBO。使用QGLWidget::makeCurrent();我强制执行GL上下文。在QGLWidget::paintEvent()中,始终具有GL上下文。render_text方法在glNewList和glEndList之间调用。在GLView::paintGL()中调用该列表。通过将render_text调用移动到GLView::paintGL()中,我不再获得“无法创建shaderMoving”。问题是,我正在使用translate in GLView::paintGL()滚动GL查看区域,在缩放之前我不希望重新绘制文本。首先,您可以随时(在上下文中)创建FBO,并保留它,并随时在其中绘制。所以你不需要在你画的位置准备它。其次,在显示列表创建中执行此操作可能是违反GL的。FBO不在显示列表的范围内。第三,顶点数组/顶点缓冲区对象(QGLBuffer)不推荐使用显示列表。但你仍然可以使用它们。就这么说吧。