【问题标题】:Bind (screen)-framebuffer to texture将(屏幕)帧缓冲区绑定到纹理
【发布时间】:2015-02-19 06:50:40
【问题描述】:

如何在 OpenGL 中捕捉/复制/抓取当前显示的屏幕并将其读入 GLuint 纹理,以便在下一帧中再次将其用作纹理?

// Set random seed
program.setUniformValue("seed", ((float)qrand()/RAND_MAX));

//Set number of alredy rendered passes
program.setUniformValue("numRenderPass",mRenderPasses);

//Bind last rendered Image
//pixelsRenderedImage = bindTexture(*renderedImage);

//Load Identity
glLoadIdentity();

//Move to rendering point
glTranslatef( -1.0, -1.0, 0.0f );

glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, pixelsScene);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pixelsRenderedImage);

// Draw geometry
//Render textured quad
glBegin( GL_QUADS );
    glTexCoord2f( 0.f, 0.f ); glVertex2f( 0, 0);
    glTexCoord2f( 1.f, 0.f ); glVertex2f( 2.0, 0);
    glTexCoord2f( 1.f, 1.f ); glVertex2f( 2.0, 2.0);
    glTexCoord2f( 0.f, 1.f ); glVertex2f( 0, 2.0);
 glEnd();

 //PseudoCode
 Read_Back_screen_to -> pixelsRenderedImage

我想绕过 glReadPixels(CPU)来加速渲染“一点点”;-)。

【问题讨论】:

  • 你认为这个问题应该以什么方式标记qt?

标签: opengl rendering


【解决方案1】:

glCopyTexImage2D() (man page) 是您正在寻找的电话。它用于将数据从当前帧缓冲区复制到纹理中。

我认为这个调用不再被使用了。对于要将渲染结果用作纹理内容的情况,首选方法是帧缓冲区对象 (FBO)。它们允许您直接渲染到纹理,避免额外的复制操作。 OpenGL 3.0 中引入了 FBO 支持。

【讨论】:

  • 此外,屏幕帧缓冲区的内容可能随时未定义。一般来说,从屏幕上的帧缓冲区中抓取图像并将其重新用于进一步的渲染步骤是非常不可靠的。改用 FBO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 2023-04-05
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多