使用glGetTexImage()保存纹理到OpenCV的Mat

chhchh222 2017-09-05 02:12:03
我用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是,发现得到图片始终是全黑的。
有没有大神来指点一下,都弄了好几天了,呜呜呜。
...全文
1057 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chhchh222 2017-09-06
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
从图形变斜的现象来看,有可能是每行的字节没有4字节对齐
恩恩,原因找到了。 glPixelStorei(GL_PACK_ROW_LENGTH, (GLint)(tempTexture.rows)); 加了这句话现在可以正常显示了,就是整体尺寸还有问题。
zgl7903 2017-09-06
  • 打赏
  • 举报
回复
从图形变斜的现象来看,有可能是每行的字节没有4字节对齐
chhchh222 2017-09-05
  • 打赏
  • 举报
回复
有没有好心人来看看啊
chhchh222 2017-09-05
  • 打赏
  • 举报
回复
我自己创建了Mat,不使用图片进行调试:

这是实际的纹理

这是我通过上述方法保存下来的图片。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧