如何使用glCopyImage2D

时间:2010-06-19 00:10:58

标签: opengl textures

我正在尝试像

这样的东西
glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);

我认为glCopyTexImage2D无法使用两个图像的非幂,所以这是一个问题;我也尝试了glReadPixels,但它对我来说太慢了。

4 个答案:

答案 0 :(得分:9)

如果glReadPixels对您来说太慢,那么glCopyTexImage2DglCopyTexSubImage2D的速度就不会快得多。在支持帧缓冲对象(如iOS)的平台上,将GPU渲染图像数据添加到纹理中的推荐(即更快)方法是使用该纹理作为帧缓冲对象的颜色附件并直接渲染到其中。也就是说,如果你仍然想要采用这种方法,那么你需要做的就是修复它:

首先,您将错误的参数传递给glCopyTexImage2D。第三个参数internalformat应该是GL_RGBA而不是0。如果您在致电glGetError后致电glCopyTexImage2D,则可能会获得GL_INVALID_OPERATION。请参阅glCopyTexImage2DglCopyTexSubImage2D的OpenGL ES 1.1手册页。

其次,正如您已经观察到的那样,glCopyTexImage2D要求其宽度和高度参数也是2的幂。处理此问题的正确方法是使用glTexImage2D分配纹理图像(您可以在NULL传递pixels),然后使用glCopyTexSubImage2D将帧缓冲内容复制到一个矩形。请注意glCopyTexSubImage2D不接受internalformat参数 - 因为它正在更新纹理的子矩形,它使用纹理的现有格式。

为了记录,在OpenGL ES 1.1或2.0中不存在glGetTexImage,这就是你获得隐式声明的原因。

答案 1 :(得分:2)

如果视频卡支持ARB_texture_non_power_of_two扩展,则可以检查视频卡是否支持2个纹理的非幂。 See here for info.

答案 2 :(得分:0)

帮助弄清楚"非权力的两个"事情是个问题,请使用像这样的glGetError():

printf("error: %#06x\n", glGetError());

将其放在代码中的不同位置以确定导致问题的行,然后在此处检查错误代码:https://www.khronos.org/opengl/wiki/OpenGL_Error

要复制我做的纹理:

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0);
glGenerateMipmap(GL_TEXTURE_2D);

绑定纹理后。有关详细信息,请查看这两个函数的文档。

答案 3 :(得分:0)

glCopyTexImage2D适用于NPOT图像。

NPT图像(非2的幂)仅受OpenGLES 2 / OpenGL 1或WebGL的支持,在OpenGLES 3 / OpenGL 2或更高版本中完全受支持。

如果要将fbo的彩色附件复制到newTexture

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, newTexture);
glTexImage2D(bindTarget, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glCopyTexSubImage2D(target, level, 0, 0, 0, 0, width, height);

如果纹理mipmap,放大滤镜和重复模式设置错误,则NPT图像将在片段着色器采样中输出黑色。

相关问题