我正在尝试类似的东西
glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);
我认为glCopyTexImage2D不适用于两个图像的非幂,所以这是一个问题;我也试过glReadPixels,但它对我来说太慢了。
如果glReadPixels
对你来说太慢了,那么glCopyTexImage2D
和glCopyTexSubImage2D
的速度就不会快得多。在支持帧缓冲对象(如iOS)的平台上,将GPU渲染图像数据添加到纹理中的推荐(即更快)方法是使用该纹理作为帧缓冲对象的颜色附件并直接渲染到其中。也就是说,如果你仍然想要采用这种方法,那么你需要做的就是修复它:
首先,你将错误的论据传递给glCopyTexImage2D
。第三个论点,internalformat
,应该是GL_RGBA
而不是0
。如果你在调用glGetError
后调用glCopyTexImage2D
,你可能会得到GL_INVALID_OPERATION
。有关glCopyTexImage2D和glCopyTexSubImage2D的信息,请参见OpenGL ES 1.1手册页。
其次,正如你已经观察到的那样,glCopyTexImage2D
要求它的宽度和高度参数也是2的幂。处理这个的正确方法是使用glTexImage2D
分配纹理图像(你可以在这里为NULL
传递pixels
),然后使用glCopyTexSubImage2D
将你的帧缓冲内容复制到一个矩形中。请注意,glCopyTexSubImage2D
不接受internalformat
参数 - 因为它正在更新纹理的子矩形,它使用纹理的现有格式。
为了记录,glGetTexImage在OpenGL ES 1.1或2.0中不存在,这就是你获得隐式声明的原因。
如果支持ARB_texture_non_power_of_two扩展,您可以检查视频卡是否支持2个纹理的非幂。 See here for info.
为了帮助确定“非幂2”是否有问题,请使用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);
绑定纹理后。有关详细信息,请查看这两个函数的文档。
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图像将在片段着色器采样中输出黑色。