我已经在工作的GPU的伪代码 - > CPU-> GPU实现:
// Render stuff here
byte *magData = glReadPixels();
// Bind the already-generated texture object
BindTexture(GL_TEXTURE0, GL_TEXTURE_2D, alias);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, MAGWIDTH, MAGHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, magData);
答案 0 :(得分:3)
您可以使用glCopyTexImage2D从后台缓冲区进行复制:
glBindTexture(GL_TEXTURE_2D, textureID);
glCopyTexImage2D(GL_TEXTURE_2D, level, internalFormat, x, y, width, height, border);
OpenGL ES 2.0始终从后台缓冲区(或用于单缓冲配置的前台缓冲区)进行复制。使用OpenGL ES 3.0,您可以使用以下命令指定副本的来源:
glReadBuffer(GL_BACK);
根据ClayMontgomery的回答(glCopyTexImage2D
很慢) - 您可能会发现使用glCopyTexSubImage2D
具有正确大小和格式化的纹理更快,因为它写入预先分配的纹理而不是分配新的缓冲每次。如果这仍然太慢,你应该按照他的建议尝试并渲染到帧缓冲区(尽管你还需要使用帧缓冲区的纹理在屏幕上绘制四边形以获得相同的结果)。
答案 1 :(得分:1)
你会发现glCopyTexImage2D()非常慢。做你想做的事的快速方法是直接渲染纹理作为FBO的附件。这可以使用OpenGL ES 2.0或1.1(带扩展)来完成。本文详细解释:
http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES