半透明原理:假设LCD是256色的
颜色格式为332(RGB)显存中的每一个字节的数据对应一个象素点
在数据写入显存之前,读取相应相素点值,然后与新的数据按一定的规则混合之后,再写入相应像素点的显存
这样主要问题关键是混合算法
混合算法目前在游戏上常用到的算法是AlphaBlend
计算公式如下假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明),Alpha混合公式如下:R(C)=(1-alpha)*R(B)+alpha*R(A)G(C)=(1-alpha)*G(B)+alpha*G(A)B(C)=(1-alpha)*B(B)+alpha*B(A)R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值
从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值
应用Alpha混合技术,可以实现游戏中的许多特效,比如火光、烟雾、阴影、动态光源等半透明效果
uC/GUI系统分为好几个层面
简单地可以归结为:1、硬件驱动层2、基本2D图形库3、窗体层次越高,涉及的内容越多,修改的工作量就越大
如果想修改最少的代码实现半透明功能,最好在硬件驱动层找切入口
在硬件驱动层中有个宏定义LCD_WRITE_MEM(Off,data)*((U8*)(DC+(((U32)(Off)))))=(data),从文档可以看到该宏定义的功能就是向显存写入像素点的值
流程如下:a、读取相应象素点值b、与新的象素点值按照混合算法转换
c、将转换结果写入显存对应位置
/设置透明度为0,完全不透明,先执行清屏
GUI_SetBkColor(GUI_WHITE);GUI_SetColor(GUI_WHITE);GUI_Clear();/填充一个方框GUI_SetColor(GUI_RED)