使用DirectDraw的Gamma控制形成淡出效果

2016-02-19 17:11 13 1 收藏

下面图老师小编跟大家分享一个简单易学的使用DirectDraw的Gamma控制形成淡出效果教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

  为什么要使用DDRAW中的Gamma控制功能来做淡出呢?有两个主要原因:第一个是因为简单;第二是因为使用Gamma淡出,你不会丢失任何存储在主表面中的信息。

  既然这样,在实现这种技术之前,有些不显眼的小事情我们必须给予注意。首先,你的主表面必须是16Bit色或更高;第二个是这种淡出只能在你的主表面上来做,因为这是在调整你的显卡的gamma设置。

  让我们认真考虑一下:在DirectDraw库中包含一个结构DDGAMMARAMP。这个结构由3个包含256个字的数组组成,分别是Red,Green和Blue。例如:

  

typedef struct DDGAMMARAMP{  WORD red[256];  WORD green[256];  WORD blue[256];}DDGAMMARAMP,FAR *LPDDGRAMMARAMP;

  这个结构保存着我们的显示卡当前的Gamma设定值。那么,来声明几个我们程序中使用的变量。

  //初始化Gamma控制以便应用

  LPDIRECTDRAWGAMMACONTROL lpDDGammaControl = NULL;

  //这个是我们将修改的斜坡值(ramp)

  DDGAMMARAMP DDGammaRamp;

  //这个结构用来保存原来的gamma值,以便淡出完成后恢复我们gamma值

  DDGAMMARAMP DDGammaOld;

  完成了这些之后我们需要查明显示是否支持gamma控制(尽管如果显卡硬件不支持它的话,DX将会用软件模拟它),所以来查询主表面:

  lpddsprimary-QueryInterface(IID_IDirectDrawGammaControl,(void **)& lpDDGammaControl);

  然后看显卡当前的gamma设置是否正确,再存储它到DDGAMMAOLD结构里

  lpDDGammaControl-GetGammaRamp(0,&DDGammaOld);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  让我们来做一下这个,并且保存值到DDGAMMARAMP结构里,以便我们修改它的值:

  lpDDGammaControl-GetGammaRamp(0,&DDGammaRamp);

  现在除非一个用户改变他们计算机上的GAMMA设定值,应当把你的DDGammaRamp结构的值增加到第256个。现在,因为每个Red,Green和Blue的值可以是任何0到65535的值,我们不想把它们值改到1。所以,我决定写下尽可能快的代码把所有的256的值到0然后每次刷新屏幕。下面是代码实现:(这里有些说不明白,附原文:

Now unless a user changes the values of the gamma on their computer the values should go up as you reach the 256th value in your DDGammaRamp structure. Now because each value of Red, Blue and Green can be anywhere from 0 to 65535 we wouldn't want to decrement our values by 1. Instead I decided to make the code as fast as possible so I set all 256 values to 0 and update the screen after each. Here is how the code looks)for(int blackloop=0;blackloop256;blackloop++){//如果一个值大于0的话,就把它设成0if(DDGammaRamp.red[blackloop]  0) {//set the current value of DDGammaRamp.Red to 0.DDGammaRamp.red[blackloop]=0;//now let's update our primarylpDDGammaControl-SetGammaRamp(0, &DDGammaRamp);surface with the new gamma setting}//这个程序有点太快了,所以让它慢一点?Sleep(1);if(DDGammaRamp.green[blackloop]  0){//设当前DDGammaRamp.yellow的值到0.DDGammaRamp.green[blackloop]=0;lpDDGammaControl-SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);} Sleep(1);if(DDGammaRamp.blue[blackloop]  0){//设当前DDGammaRamp.Blue的值到0.DDGammaRamp. blue [blackloop]=0;lpDDGammaControl-SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);} Sleep(1);} //结束

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  现在fade完成了,我们需要恢复所有原来的gamma值,否则屏幕一直是黑的:

  lpDDGammaControl-SetGammaRamp(0, &DDGammaOld);

  然后这就把它伪装好了。用这段代码你还可以做些其他的事情。例如:你可以修改这段代码使你的玩家被某物打中时,屏幕闪现红色;游水到有毒废料区时变成绿色;淹死了的时候变蓝。你也可以修改这段代码形成淡入,就留给其他人去做吧。

来源:http://www.tulaoshi.com/n/20160219/1614482.html

延伸阅读
标签: 电脑入门
我们在打开和关闭Launchpad 时,会出现淡入淡出的效果,但是有些用户觉得这样会导致Launchpad 的打开或关闭速度变慢,想要将淡入淡出效果关掉,那该怎么办呢? 如何禁用Launchpad 淡入淡出效果? 运行终端(应用程序 – 实用工具 – 终端),并分别执行下列命令: defaults write com.apple.dock springboard-show-duration ...
UDP协议基础: UDP(UserDatagramProtocol)是一种无连接协议,与TCP操作不同,计算机间并不需要建立一个连接,同时,一个UDP应用可同时作为应用的客户或服务器方。 由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。在TCP应用中,一个Winsock控制必须明确地设置成“监听”,而其它Winsock控制则必须使用...
标签: flash教程
制作方法: 首先,我这里是建的场景大小是:550*400,然后找两副自己喜欢的图片(不喜欢也行),新建一元件,把其中一副图片居中放入第一桢,再把另一副图片居中放入第二桢,分别设置第一桢和第二桢上的动作为: stop() 好了,回到主场景中: 将刚才建的元件拖入场景中居中放置,接着新建一层,时间桢上写入as: MovieClip.prototype.setBri...
标签: 电脑入门
放时出现的截图变黑问题,一般有两个方法可以用来解决,一个方法是用两个不同的播放器,同时打开同一个文件;另一个方法是禁用DirectDraw。 在本文中,您将了解到到如下内容: 问题视频截图后,图片是黑的。 熟悉Windows XP和Windows 7的用户应该知道(默认情况下),DirectDraw在Windows XP和Windows 7下都是已启用状态。不同的是,在Windows ...
《龙腾世纪2》gamma值调整方法 DA2游戏中video选项中Gamma只能拖到1.0 打开文档里面的\BioWare\Dragon Age 2\Settings DragonAge.ini 找到Gamma=1.0改成2.0保存,再进游戏. 这下调节范围就大了,画面偏暗的同学可以试试..   《龙腾世纪2》dlc“遗产”详细图文攻略 由会员 蓝殇催 原创 1:首先下载DLC安装包进行安装,安装之后,破解DLC,DLC...

经验教程

37

收藏

86
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部