我需要从大纹理(2048x2048)中提取一个小矩形(200x200),并将RGBA像素放入内存中。似乎有两种方法可以做到这一点:
a)使用glGetTexImage并传入接收整个纹理的缓冲区,并从中读取相应的像素
b)创建一个帧缓冲区,使用仅包含所需部分的纹理绘制帧缓冲区,并提取使用glReadPixels生成的像素。
我猜b)速度更快,但我相对新手,我想知道我是否朝着正确的方向前进。 a)更容易编码,所以我想知道可能的速度命中是否可以忽略不计。
史蒂夫
答案 0 :(得分:6)
鉴于图像数据在纹理中,有几种可能的解决方案。从最希望到最少订购:
使用glGetTextureSubImage
(需要OpenGL 4.5或ARB_get_texture_sub_image)直接完成工作。
使用glCopyImageSubData
(需要OpenGL 4.3或ARB_copy_image。或NV_copy_image。后者为implemented on more hardware than just NVIDIAs)到copy the desired rectangle进入适当大小的纹理,然后使用{{1在那上面。
将大纹理附加到FBO,然后将小纹理附加到另一个FBO。使用glGetTexImage
(需要OpenGL 3.0或ARB_framebuffer_objects)to copy the desired section of the large texture to the small one。然后在小纹理上使用glBlitFramebuffer
。
只有在非常旧的OpenGL实现下工作时,才需要将纹理渲染到带有三角形的帧缓冲区。