我正在尝试像
这样的东西glEnable(texture_2d)
glBindTexture
glCopyTexImage2D
glDisable(GL_TEXTURE_2D);
我认为glCopyTexImage2D无法使用两个图像的非幂,所以这是一个问题;我也尝试了glReadPixels,但它对我来说太慢了。
答案 0 :(得分:9)
如果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
参数 - 因为它正在更新纹理的子矩形,它使用纹理的现有格式。
为了记录,在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图像将在片段着色器采样中输出黑色。