关于窗口模式下的IDirectDrawSurface7.Blt()的讨厌问题,各位大哥谢谢了!
关于窗口模式下的IDirectDrawSurface7.Blt()的讨厌问题,各位大哥谢谢了!
楼主Scarlette(Lord of Borland)2002-01-04 17:40:50 在 扩充话题 / 灌水乐园 提问 小弟的程序从一块图像采集卡中获取DIB图像,然后复制到离屏表面,经过一点小处理后Blt到主表面。由于是在窗口模式下,因此无法控制主表面的色深。更糟糕的问题在于,图像采集卡获取的总是24bit的DIB,用户大多数情况下用的是16bit或者32bit显示模式。如果把离屏表面定死为24bit,那就彻底没戏了——IDireciDrawSurface7.Blt()是不作颜色转换的。
所以,离屏表面只能和主表面采用相同的色深。但这样一来,24Bit DIB到离屏表面的复制就必须完成色深转换。我尝试自己写了带有色深转换的复制过程,但是自己做转换的效率实在太低,30 FPS时CPU占用率已经让人一头汗了,而我的程序必须还要做其他的事情。而且,必须考虑24->16, 24->24, 24->32等各种情况,如果哪天图像采集卡变成16bit或者32bit了,那就废了……
后来,想了一个比较无耻的方法:每次复制的时候,都获取离屏表面的DC,然后将DIB图像DrawDIBDraw()上去。这样色深转换是不成问题了,但是,DrawDIBDraw()同样也是完全软件完成的,一点硬件加速也没有,效率实在不敢恭维,和自己写的差不多,甚至更糟:每次表面GetDC()都费不少时间,而且无端多了一个HDRAWDIB设备,还需要Video For Windows的支持,真是OOXX……
现在只好求教于各位大哥,有没有什么方法可以尽量让硬件加速完成带有色深转换的复制工作? 问题点数:0、回复次数:8Top
1 楼gddsky()回复于 2002-01-04 17:45:24 得分 0
我建议你使用D3D8来完成2D图像的编程Top
2 楼Scarlette(Lord of Borland)回复于 2002-01-04 17:52:03 得分 0
问题在于我不能要求客户的机器上必须有DirectX 8呀,而且如果这样做的话,整套代码就要全改了。:(Top
3 楼gddsky()回复于 2002-01-05 00:13:54 得分 0
这个我就不清楚了,对不起
做游戏一班不会去做窗口的(我是指正规)Top
4 楼lyzcom(初学者)回复于 2002-01-05 07:50:16 得分 0
呵呵,我现在都不喜欢用DX了。我现在自己做一套基于DX基本功能的扩展程序库,用来做游戏。就像风魂一样:)DX有好多问题都实在是太讨厌了一点,页面丢失,操作烦锁……Top
5 楼Scarlette(Lord of Borland)回复于 2002-01-05 15:34:17 得分 0
gddsky:
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?Top
6 楼gddsky()回复于 2002-01-05 19:08:40 得分 0
读图像文件时可以直接指定使用哪种方式的颜色模式(如A4R4G4B4)
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了Top
7 楼Scarlette(Lord of Borland)回复于 2002-01-05 22:07:39 得分 0
老大,可能我没说清楚,我从图像采集卡捕捉来的DIB可是30 FPS啊,每一帧都不一样,绝对不是从文件中读取的,要不然哪有这么麻烦,我可是要每秒转换30次啊!Top
8 楼gddsky()回复于 2002-01-06 08:01:16 得分 0
ao,本人水平不够了,我没有试过你说的DIB,所以也不知道要怎么做了,不过,说实话,你为什么一定要窗口式的呢???
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!Top
-
相关文章
FourCC
楼主jinbing(若晴)2002-01-04 17:42:29 在 VC/MFC / Visual C++ 资源 提问那位高手知道fourcc是什么东东?高分奉上 问题点数:…
索虎数码工作室想找几个兼职的成员加盟,谁有兴趣呀。
我写一个控件,有个属性需要用TNotebook的Pages的属性编辑器,应该怎么办,请各位多帮忙。
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
