1
  • I render a scene (to the default renderbuffer)
  • I want to grab a rectangle from this scene and create a texture out of it
  • I would like to do it without glReadPixels()ing down to the CPU and then uploading the data back up to the GPU
  • Is this possible using OpenGL ES 2.0?
  • P.S. - I want to use a POT area of the screen, not some strange shape

Pseudocode of my already-working GPU->CPU->GPU implementation:

// 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);
4

2 回答 2

4

您可以使用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正确大小和格式的纹理会更快,因为它会写入预分配的纹理,而不是每次都分配一个新的缓冲区。如果这仍然太慢,您应该尝试按照他的建议进行操作并渲染到帧缓冲区(尽管您还需要使用帧缓冲区的纹理在屏幕上绘制一个四边形以获得相同的结果)。

于 2013-08-13T09:40:21.510 回答
1

你会发现 glCopyTexImage2D() 真的很慢。做你想做的事的快速方法是直接渲染到纹理作为 FBO 的附件。这可以通过 OpenGL ES 2.0 或 1.1(带有扩展)来完成。这篇文章详细解释:

http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES
于 2013-08-14T18:54:15.667 回答