将(屏幕)-framebuffer绑定到纹理

时间:2014-12-20 14:37:05

标签: opengl rendering

如何在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)来加速渲染"一点点" ; - 。)

1 个答案:

答案 0 :(得分:2)

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

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