在 QGLFrameBufferObject 中绘制

Posted

技术标签:

【中文标题】在 QGLFrameBufferObject 中绘制【英文标题】:Draw in QGLFrameBufferObject 【发布时间】:2014-07-04 06:29:28 【问题描述】:

使用 Qt 和 opengl,我想画一个 QGlFrameBufferObject 吗? 我试试这个:

QGLFrameBufferObject * fbo = new QGLFramebufferObject(200, 200, QGLFramebufferObject::NoAttachment, GL_TEXTURE_2D, GL_RGBA32F);  
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, fbo->size().width(), fbo->size().height(), 0.0f, 0.0f, 1.0f);
fbo->bind();
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
fbo->release();
fbo->toImage().save("test.jpg"));

但我没有得到红色图像。

其他问题

如果我想用 :

glBegin(GL_QUAD); 
glColor3d(0.2, 0.5, 1.0); 
glVertex2i( 10, 20);
glColor3d(0.7, 0.5, 1.0); 
glVertex2i( 15, 20);
glColor3d(0.8, 0.4, 1.0); 
glVertex2i( 15, 25);
glColor3d(0.1, 0.9, 1.0); 
glVertex2i( 10, 25);
glEnd();

我还需要glClear() 吗?

【问题讨论】:

你能试试GL_RGBA8这样的格式吗? GL_RGBA32F 应该 工作,但它是一种较新且较少使用的格式。为了缩小问题范围,值得检查更基本的格式是否有效。 GL_RGBA8 也有同样的问题。 【参考方案1】:

您永远不会真正清除帧缓冲区。 glClearColor() 仅设置用于清除的颜色,但不清除任何内容。您需要在此处添加第二行:

glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glClear() 调用将使用您在第一次调用中指定的清除颜色清除颜色缓冲区。帧缓冲区内容最初是未定义的,因此在开始绘制之前,您应该始终使用glClear() 调用清除帧缓冲区。唯一的例外是,如果您确定您渲染的图元将覆盖绘图表面的每个像素。即便如此,在某些架构上,仍然首先调用glClear() 实际上会更好地提高性能。

只要您只清除缓冲区,这应该没关系。但是一旦你想开始绘图,你还需要设置视口:

glViewport(0, 0, 200, 200);

【讨论】:

请不要编辑问题以将它们变成不同的东西。该站点的目的是建立一个问题和答案的存储库。如果问题被编辑,答案将不再与问题匹配。 好的,我扩展了答案。

以上是关于在 QGLFrameBufferObject 中绘制的主要内容,如果未能解决你的问题,请参考以下文章

在 QGLFramebufferObject 上渲染时错误的 alpha 混合

QPaint 到 QGLFramebufferObject 纹理上?

QGLFramebufferObject浮点纹理

渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误

Matplotlib_2

R语言排序函数汇总