游戏开发论坛

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

glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU上为

[复制链接]

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2005-12-22 19:16:00 | 显示全部楼层 |阅读模式
在窗口CMyWndClass上用OpenGl画了一个图形,然后用glReadPixels获取窗口中的图像,将图像读到缓冲区m_lpDIBits中。我的程序最初是运行在intel 的32位CPU上,用glReadPixels读到的图像跟窗口上显示的一致。后来,我把程序拿到intel 的64位CPU上运行,发现,图像严重失真。不知什么原因? 请熟悉opengl的老兄帮忙分析一下。
下面是我使用glReadPixels的方式,不知有什么问题。

LPBYTE CMyWndClass::GetImageData()
{               
   ::glReadPixels(0, 0, m_nImageSize[0], m_nImageSize[1],
         GL_RGB, GL_UNSIGNED_BYTE,   (GLvoid  *)m_lpDIBits);
   return m_lpDIBits;
}
其中: m_nImageSize[0] = (窗口宽度 / 4)  * 4
       m_nImageSize[1] = 窗口高度
m_lpDIBits为保存屏幕图像数据的缓冲区,在外面已经生成。

这里的失真就跟“花屏”一样的效果。

1

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2005-12-23 12:35:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

Check out your glPixelStore* ()

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2005-12-23 13:56:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

应该不是内存地址错位问题,我在glReadPixels()函数调用之前,先调用::SwapBuffers(hDc);则glReadPixels()函数得到正确图像,但是CMyWndClass窗口上的图像却是“花屏”了。

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2005-12-24 09:29:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

最好还是把花了的图贴一幅出来
另外请补充说明一下图象读回后你用什么方法显示的.

如果是图象被扭曲, 可能是需要强制对齐, 用GL_RGBA替换glReadPixels中的GL_RGB;

应该使用如下顺序读取图象:
glFlush( );//或glReadBuffer(GL_FRONT);
glReadPixels(...);
::SwapBuffers(hDC);
因为不同驱动实现SwapBuffer的方式是不一定相同的, 可以是[B]复制[/B], [B]交换[/B], [B]复制后 后缓存状态不定[/B](参见OpenGL超级宝典)

13

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2005-12-25 14:23:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

为什么不用glCopysubTeximage2d?

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2005-12-26 13:09:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

谢谢各位,请问如何用opengl读取窗口中的图像?

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2005-12-26 13:36:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

因为不同驱动实现SwapBuffer的方式是不一定相同的, 可以是复制, 交换, 复制后 后缓存状态不定(参见OpenGL超级宝典),

OpenGL超级宝典:哪一章节提到了?

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2005-12-27 18:58:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

多谢各位,特别是bombbear.

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-12-27 22:14:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

align

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2005-12-29 10:31:00 | 显示全部楼层

Re:glReadPixels函数在32位CPU上能正常取图像数据,在64位CPU

好久没能上网
关于《OpengGL超级宝典(第三版)》中显存交换的内容好象在第二部分——“OpenGL无处不在”中关于Windows系统的介绍中。
一句带过,我再查下告诉你页数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 02:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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