Qt 如何在QGLWidget中设置alpha混合GL_纹理_2D的颜色
我是Opengl中混合和纹理的新手。My render_text()方法使用QPaint中的drawText方法,并将QImage作为其设备。QImage将成为GL_纹理_2D,然后附着到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_
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)不推荐使用显示列表。但你仍然可以使用它们。就这么说吧。