如何在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)来加速渲染"一点点" ; - 。)
答案 0 :(得分:2)
glCopyTexImage2D()
(man page)是您正在寻找的电话。它用于将当前帧缓冲区中的数据复制到纹理中。
我不认为这个电话已经被使用了很多。对于想要将渲染结果用作纹理内容的情况,首选方法是帧缓冲对象(FBO)。它们允许您直接渲染纹理,避免额外的复制操作。在OpenGL 3.0中引入了FBO支持。