硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3280|回复: 1
收起左侧

STM32F429的LTDC背景层,图层1,图层2和Alpha混合介绍

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-7-18 10:05:43 | 显示全部楼层 |阅读模式
LTDC除了图层1和图层2两个硬件图层以外,还有一个背景层。由于背景层的刷新不需要显存空间,所以可以用这个图层验证LTDC时序配置是否有问题。

22.png

对于背景层来说,仅支持单色设置,固定颜色格式RGB888(LTDC_HandleTypeDef hltdc_F)hltdc_F.Init.Backcolor.Blue = 0
hltdc_F.Init.Backcolor.Green = 0
hltdc_F.Init.Backcolor.Red = 0

对于图层1和图层2来说,支持如下8种颜色格式:
– ARGB8888
– RGB888
– RGB565
– ARGB1555
– ARGB4444
– L8(8 位 Luminance 或 CLUT)
– AL44(4 位 alpha + 4 位 luminance)
– AL88(8 位 alpha + 8 位 luminance)


实现Alpha混合的关键是要有一个变量可以设置各种透明度。对此,STM32F429准备了两个Alpha供使用:
一个是常数Alpha(0x00表示完全透明,0xFF表示完全不透明),所有颜色格式都可以使用。
另一个是像素Alpha,也就是ARGB8888,ARGB1555,ARGB4444等颜色格式的Alpha通道数值,也就是我们为图层每个位置绘制的实际颜色值。



了解了这点后就是具体的实现了。STM32F429的参考手册给出了具体的混合公式‘

BC          =  BF1       x     C     +   BF2      x    Cs
混合后的颜色= 混合系数1 x 当前层颜色 + 混合系数2 x 底层混合后的颜色


混合系数1可以选择:
(1)常数 Alpha
(2)像素 Alpha x 常数 Alpha

混合系数2可以选择:
(1)1 - 常数 Alpha
(2)1 - 像素 Alpha x 常数 Alpha

底层混合后的颜色:
(1)可以是背景层。
(2)可以是背景层与图层1混合后的颜色。

那么公式就变成如下形式(主要是如下两种):
混合后的颜色 = 常数 Alpha x 当前层颜色 + (1 - 常数 Alpha) x 底层混合后的颜色。
混合后的颜色 = 像素 Alpha x 常数 Alpha x 当前层颜色 +
(1 - 像素 Alpha x 常数 Alpha) x 底层混合后的颜色。

再进一步简化,代入HAL库参数(LTDC_LayerCfgTypeDef  pLayerCfg):
像素Alpha是ARGB8888,ARGB1555等颜色格式的Alpha数值,也就是我们为图层每个位置绘制的实际颜色值,我们这里用AlphaValue表示。
混合后的颜色 = (pLayerCfg.Alpha /255 ) x 当前层颜色 +
(1 - pLayerCfg.Alpha /255 ) x 底层混合后的颜色。
混合后的颜色 = (AlphaValue/255)x (pLayerCfg.Alpha /255 ) x 当前层颜色 +
(1 - (AlphaValue/255)x (pLayerCfg.Alpha /255 )) x 底层混合后的颜色。

注,Alpha值要做归一化,Alpha的范围是0 - 255,比如Alpha = 100,那么代入公式的时候就是100/255。


举例:
(1)混合因数1选择像素 Alpha x 常数 Alpha。
(2)混合因数2选择像素 Alpha x 常数 Alpha。
(3)使用图层1和背景层,图层1使用ARGB8888颜色格式。
(4)背景色 = 0xFF0000,图层1位置坐标(0,0)颜色值0x5500FF00。
(5)Alpha常数 = 0x77
混合后的颜色 = (AlphaValue/255)x (pLayerCfg.Alpha /255 ) x 当前层颜色 +
(1 - (AlphaValue/255)x (pLayerCfg.Alpha /255 )) x 底层混合后的颜色。
             = (0x55/255)x (0x77/255) x 0x00FF00 +
(1 - (0x55/255)x (0x77/255)) x 0xFF0000
             =  0xD7809C

最后注意一点:
如果大家设置的图层显示区没有显示满整个显示屏,且使用的ARGB颜色格式,那么未覆盖的区域会使用图层默认颜色。对此HAL库有专门的配置:
LTDC_LayerCfgTypeDef      pLayerCfg
pLayerCfg.Alpha0 = 0;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0;







回复

使用道具 举报

4

主题

1444

回帖

1456

积分

至尊会员

积分
1456
发表于 2020-7-18 11:18:51 | 显示全部楼层
硬汉大哥,这个可以做什么特效?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 22:56 , Processed in 0.235457 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表