DXUTBlendColor::Blend()实现DirectX3D窗口GUI动态组件的分析研究(多图)
作者:liigo
时间:2010/4/26
首发地址:http://blog.csdn.net/liigo/archive/2010/04/26/5530942.aspx
转载请注明出处:http://blog.csdn.net/liigo
前传
前传,故事发生在原作之前,而创作于原作之后。我借此宝地,非常抱歉地声明,此文分析方法有误!错误源于我对 fElapsedTime 的理解有误。原作中假设fElapsedTime的值随时间持续增长;其实不然,fElapsedTime通常是记录“当前正在渲染的帧”自开始渲染以来消耗的时间,到开始渲染下一帧时自然被清零。fElapsedTime不是一个持续增长的值,而是一个不断跳动在0到0.0x秒(取决定于FPS)之间的一个值。
在明确了fElapsedTime含义之后,再回头去看DXUT中的动态效果是如何形成的:当fElapsedTime大于0时,表达式 powf(fRate, 30 * fElapsedTime) 的值小于1,调用 DXUTBlendColor::Blend() 后当前颜色值(Current)向目标颜色值过渡,渲染下一帧时,如果fElapsedTime还大于0,当前颜色值继续向目标颜色值过渡,如此循环下去,直至当前颜色过渡到跟目标颜色值一致,动态效果结束。如果在此过程中,偶然有fElapsedTime为0的情况,表达式 powf(fRate, 30 * fElapsedTime) 的值为1,这种情况下不会改变当前颜色值,总体上不会影响动态效果;可以想象如果碰巧fElapsedTime始终为零则动态效果永不能实现(如果某个DXUT控件是当前帧中第一个被渲染的对象,会不会发生这种情况呢?)。
我原来的意图是要预测动态效果的持续时间的,现在看来问题复杂化了,它似乎受“起始颜色和目标颜色的差值”、组件在当前帧所有对象中的渲染顺序(受3D引擎控制,主要影响到fElapsedTime)、每秒渲染帧数、fRate等综合性影响,难以简单的预测,因而放弃。
以下是原作正文,保留仅作留念。
微软 DirectX 3D,DXUT GUI窗口组件中,其中一些组件具有动态效果。例如,鼠标移到按钮上方它会改变背景颜色,把鼠标移出,按钮颜色会慢慢恢复为之前的颜色,这是一个随时间过渡的动态渐变效果。这种动态效果,主要是通过 DXUTBlendColor::Blend() 实现的,相关代码如下:
初步浏览代码,发现 DXUTBlendColor::Blend() 依据参数修改其成员 Current 的颜色值,三个参数中,iState 和 fRate 通常是不变值(在某个在动画期间),而 fElapsedTime 是一个随时间增长的值(单位为秒)。由于在渲染(Render)过程中不断调用 DXUTBlendColor::Blend(),不断传入新的随时间增长的 fElapsedTime,因而 DXUTBlendColor::Current 中的颜色值也在不断变化,逐步过渡接近 iState 所指定的目标颜色值,形成动态效果。fRate 决定着动态效果的变化速率,或者说决定着动态效果的持续时间。初步推论,fRate 是一个介于0到1之间的小数,其值越小,动态效果持续时间越短,其值越大,动态效果持续时间越长。
本文主要内容,就是通过编写一个分析程序,研究 fRate 对于该动态效果的具体影响。我想得到类似这种结论:当 fRate = 0.8 时,动画效果能持续多长时间?我想制作一个持续3秒的动画效果,应该把 fRate 设置为多大?
我的分析程序使用易语言编写。分析程序的主要理论数据依据,来源于 DXUTBlendColor::Blend() 源代码中的这样一个表达式,powf(fRate, 30 * fElapsedTime),它的计算结果受fRate和fElapsedTime共同影响,决定着颜色过渡的快慢(或持续时间的长短),当结果为0时表示动态过渡效果已结束。对于用户指定的某个特定的fRate,分析程序模拟演示随时间递增的fElapsedTime,以曲线图的形式直观的展现fRate对动态过渡效果持续时间的影响。
此分析程序的易语言核心源代码不足十行:
分析程序运行结果如下(水平轴为时间轴,单位为秒,绿色曲线进入水平状态时表示动态效果已结束):
分析程序运行结果分析:
当 fRate = 0.99 时,动态效果将持续十多秒(fRate更大时,持续时间更长)
当 fRate = 0.98 时,动态效果将持续约 6, 7 秒
当 fRate = 0.96 时,动态效果将持续约 3 秒
当 fRate = 0.9 时,动态效果将持续约 1 秒
当 fRate = 0.8 时,动态效果将持续约 0.6 秒
当 fRate = 0.7 时,动态效果将持续约 0.4 秒
当 fRate = 0.6 时,动态效果将持续约 0.3 秒
当 fRate = 0.5 时,动态效果将持续约 0.2 秒
当 fRate < 0.5 时,动态效果持续时间小于 0.2 秒
当 fRate = 0 时,没有动态效果,或者说动态效果持续时间为0。
在GUI系统中,动画效果持续时间不宜太长也不宣太短,适中最好。在微软实现的 CDXUTButton 按钮组件中,鼠标离开时的动态效果,使用的 fRate 为 0.8,即动画持续时间约 0.6 秒。
分析程序可执行文件及其易语言源代码下载地址:http://download.csdn.net/source/2287802
全文完。谢谢。