使用glGetTexImage()保存纹理到OpenCV的Mat
我用glTexImage2D贴了一个与我的视口等大的背景纹理,大小为(1024*16)*(1024*16),再用glTexSubImage2D贴一些图,替代背景纹理的某些部分。我想把这张更新过的纹理贴图保存下来(就是背景纹理上贴了新的纹理的)。
据我所知OpenGL有这么一些函数是可以保存纹理的:
glReadPixels是保存帧缓存上的指定矩形的数据;
glCopyTexImage2D也是保存帧缓存的数据的;
还有glGetTexImage,可以将指定纹理数据保存下来;
首先我有一个疑问,glReadPixels、glCopyTexImage2D都是保存帧缓存上的数据的,我查阅的资料按我的理解是说,他们保存的是屏幕范围内的数据,但是,由于我的视口很大,远大于窗口大小(即屏幕大小),所以如果只保存帧缓存上的数据,是不能实现保存整个纹理的。
所以我尝试了glGetTexImage。
这是我的代码:
cv::Mat temptexture(height, width, newImg.type());
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, temptexture.data);
flip(temptexture, temptexture, 0);//这一步是因为Mat存储数据的方向刚好相反,所以做了下翻转
cv::imwrite("1.bmp", temptexture);
当我查看1.bmp是,发现得到图片始终是全黑的。
有没有大神来指点一下,都弄了好几天了,呜呜呜。