游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9657|回复: 11

[求教]opengl场景中的效果怎样保存为图片

[复制链接]

1

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2005-9-28 13:32:00 | 显示全部楼层 |阅读模式
我出学opengl学着做了些效果,光照,纹理什么的。我想在程序运行的过程中把场景当前的图像保存为一张效果图。但是不知道该怎么做,不知道各位大虾有没有解决的办法或者思路,给点提示吧。先在这里谢过了:) [em17] [em17] [em17]

55

主题

175

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2005-9-28 13:42:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

glReadPixels读出Sceen Framebuffer中的图像数据,使用诸如bmp等图像格式存储.

8

主题

65

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2005-10-7 14:33:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

printscreen不行吗?直接复制到mspaint里面保存不就得了

1

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2005-10-8 13:12:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

    我使用glReadPixels读出Sceen Framebuffer的方法,保存成了bmp的图象。但是锯齿有点严重,在场景里的图象是很平滑的(使用过了平滑效果),是否有人能给点提示。我是直接使用的glReadPixels,请问是不是要选择那个一buffer啊?
   我自己的感觉是保存的是原始图象的那个buffer而不是最终效果的那个buffer,有没有对opengl的buffer比较了解的达人,给兄弟的提示吧。
   直接截取屏幕的办法我也用过,截出来的图象没有锯齿和显示器上显示的一样,不过始终觉得不是正道,虽说白猫黑猫,抓到耗子就是好猫,但是我还是想直接从buffer中读取,毕竟学习阶段还是把这些东西搞清楚的比较好。
   感谢linghuye,lyon提供的方法,希望这个讨论能够继续,大家共同进步:)

1

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2005-10-8 15:40:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

我自己又研究了一下,我觉得因为我读取的是帧缓存所以没有吧平滑的效果读取出来。因该读取积累缓存里的图象就对了,如何选择我要读取那个缓存呢?请指点一下。
      我查了红宝书,上面有个glSelectBuffer的函数,但是好像不是选择要操作那个buffer用的?大家给点意见吧。谢啦。

55

主题

175

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2005-10-8 19:18:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

累积缓存只是中间的处理数据,不是图像数据.理论上glReadPixels读取的就是最终效果的图像,不论该图像效果是怎么达成的.在我的程序里,它运行正常不会出现锯齿.

默认使用OPENGL_DOUBLE_BUFFER情况下,glReadPixels读取的是GL_BACK,默认作图也在GL_BACK上,一般要在作图完毕后,wglSwapBuffer之前进行glReadPixels.

1

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2005-10-12 15:40:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

感谢大家,我已经用glReadPixels将buffer中的数据读出来的。并且保存到了一个bmp文件中,但是比较郁闷的是,颜色有点出入,查了些资料,使用交换r和b然后在保存,颜色不对,而且出现了隔行扫描的效果,如果在交换之前对R、G、B分量进行R=255-R的操作,没有隔行扫描的效果,但是变成了底片的样子。郁闷,能不能再给点意见,就快要成功了。;)

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2005-10-12 17:19:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

glReadPixels(0,0,m_nWidth,m_nHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,buf);
然后
    BITMAPINFOHEADER bih = {0};
    bih.biCompression = BI_RGB;
    …………
试试看,我是这样做的,并且可以正常截取

55

主题

175

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2005-10-12 18:14:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

glReadPixels的参数GL_BGR_EXT 或 GL_RGBA 给出读取出的象素buffer目标格式.

存储bmp要注意bmp的一般存储格式是RGB格式,如果用GL_BGR_EXT读取(据说用这个比较快),要记得交换B,R.如果用RGBA,则其象素肯定对应相应bmp格式内的RGB,无需进行附加操作.

要注意bmp格式要求每行DWORD字节对齐,及其他格式上的要求.
要注意OpenGL图像数据存储为从下到上,跟Windows的思维相反,一般在最后要进行一次图像颠倒.

我想此后你还会发现,如果把其他窗口overlap你的opengl窗口,将导致读取被overlap窗口部分的象素失效,这是因为Opengl的pixel owner ship测试导致.

1

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2005-10-17 14:32:00 | 显示全部楼层

Re:[求教]opengl场景中的效果怎样保存为图片

终于保存成功了,就是B和R要交换的问题。呵呵,看似简单的一个小功能动起手来还是很要花费一番功夫的。感谢大家给的意见。
还有一个问题,我保存的时候只能保存在viewport中看到的部分,超出的部分就保存不了了,比方说我将场景放大,然后观察某一局部的效果,然后点击保存,只能保存我看到的部分。我觉得整个图象都在内存中,因该有办法把所有的部分都保存出来的。是不似要读别的缓存,还是在裁减之前读取。希望继续给点提示:)
感谢大家的参与,特别感谢linghuye兄给我的提示。我在这里学到不少东西,对opengl更有兴趣啦:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 08:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表