如何使用glCopyImage2D

问题描述 投票:8回答:4

我正在尝试类似的东西

glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);

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

opengl textures
4个回答
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参数 - 因为它正在更新纹理的子矩形,它使用纹理的现有格式。

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


2
投票

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


0
投票

为了帮助确定“非幂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);

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


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图像将在片段着色器采样中输出黑色。

© www.soinside.com 2019 - 2024. All rights reserved.