glReadPixels直接到纹理

时间:2013-08-13 01:29:42

标签: ios opengl-es

  • 我渲染一个场景(到默认的渲染缓冲区)
  • 我想从这个场景中抓取一个矩形并用它创建一个纹理
  • 我想在没有glReadPixels()的情况下执行此操作,然后将数据上传回GPU
  • 这可以使用OpenGL ES 2.0吗?
  • P.S。 - 我想使用屏幕的POT区域,而不是一些奇怪的形状

我已经在工作的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);

2 个答案:

答案 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