硬汉嵌入式论坛

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

[LTDC] STM32H7的LTDC背景层,图层1和图层2的Alpha混合关系说明

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107009
QQ
发表于 2019-4-5 11:52:21 | 显示全部楼层 |阅读模式
下面这个图比较能说明问题
关系就是背景层跟图层1混合,混合后的颜色可以跟图层2混合。
1.jpg


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

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

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



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

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;

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107009
QQ
 楼主| 发表于 2019-4-5 14:04:42 | 显示全部楼层
更新完毕。
回复

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-4-5 17:59:56 | 显示全部楼层
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-4-5 20:42:48 | 显示全部楼层
到时候深入了解一下。多谢老大分享。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 09:13 , Processed in 0.188726 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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