所以,离屏表面只能和主表面采用相同的色深。但这样一来,24Bit DIB到离屏表面的复制就必须完成色深转换。我尝试自己写了带有色深转换的复制过程,但是自己做转换的效率实在太低,30 FPS时CPU占用率已经让人一头汗了,而我的程序必须还要做其他的事情。而且,必须考虑24->16, 24->24, 24->32等各种情况,如果哪天图像采集卡变成16bit或者32bit了,那就废了……
后来,想了一个比较无耻的方法:每次复制的时候,都获取离屏表面的DC,然后将DIB图像DrawDIBDraw()上去。这样色深转换是不成问题了,但是,DrawDIBDraw()同样也是完全软件完成的,一点硬件加速也没有,效率实在不敢恭维,和自己写的差不多,甚至更糟:每次表面GetDC()都费不少时间,而且无端多了一个HDRAWDIB设备,还需要Video For Windows的支持,真是OOXX……
现在只好求教于各位大哥,有没有什么方法可以尽量让硬件加速完成带有色深转换的复制工作?
8 个解决方案
#1
我建议你使用D3D8来完成2D图像的编程
#2
问题在于我不能要求客户的机器上必须有DirectX 8呀,而且如果这样做的话,整套代码就要全改了。:(
#3
这个我就不清楚了,对不起
做游戏一班不会去做窗口的(我是指正规)
做游戏一班不会去做窗口的(我是指正规)
#4
呵呵,我现在都不喜欢用DX了。我现在自己做一套基于DX基本功能的扩展程序库,用来做游戏。就像风魂一样:)DX有好多问题都实在是太讨厌了一点,页面丢失,操作烦锁……
#5
gddsky:
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?
#6
读图像文件时可以直接指定使用哪种方式的颜色模式(如A4R4G4B4)
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了
#7
老大,可能我没说清楚,我从图像采集卡捕捉来的DIB可是30 FPS啊,每一帧都不一样,绝对不是从文件中读取的,要不然哪有这么麻烦,我可是要每秒转换30次啊!
#8
ao,本人水平不够了,我没有试过你说的DIB,所以也不知道要怎么做了,不过,说实话,你为什么一定要窗口式的呢???
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!
#1
我建议你使用D3D8来完成2D图像的编程
#2
问题在于我不能要求客户的机器上必须有DirectX 8呀,而且如果这样做的话,整套代码就要全改了。:(
#3
这个我就不清楚了,对不起
做游戏一班不会去做窗口的(我是指正规)
做游戏一班不会去做窗口的(我是指正规)
#4
呵呵,我现在都不喜欢用DX了。我现在自己做一套基于DX基本功能的扩展程序库,用来做游戏。就像风魂一样:)DX有好多问题都实在是太讨厌了一点,页面丢失,操作烦锁……
#5
gddsky:
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?
那你的意思是在DX8中把DIB当作纹理,然后贴到一个多边形上?这样能完成色深转换吗?
#6
读图像文件时可以直接指定使用哪种方式的颜色模式(如A4R4G4B4)
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了
色深转换,我没有试过,不过,你可以把24BIT转成32BIT啊,只要将ALPHA值都设为完全不透明就行了
#7
老大,可能我没说清楚,我从图像采集卡捕捉来的DIB可是30 FPS啊,每一帧都不一样,绝对不是从文件中读取的,要不然哪有这么麻烦,我可是要每秒转换30次啊!
#8
ao,本人水平不够了,我没有试过你说的DIB,所以也不知道要怎么做了,不过,说实话,你为什么一定要窗口式的呢???
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!
还有,如果真的要窗口式的,我想你应该去看一下D3D8里面的MFC例程(对不起,对于MFC,我不感兴趣,所以就没有看了)
对不起了!