概要
gd32f450的显示器并行接口,硬件上就支持两个图层,对于需要静态显示背景,动态显示顶层的应用场合非常适合。同样的芯片还有stm32f429等。
对于图像的混合在这两款芯片中实际上有两个概论,一个是显示控制器,还有一个则是利用DMA的图像加数器,两款芯片暂时还没发现寄存器的配置上有什么区别,只是在名称上有些区别。
本文主要针对显示控制器多层混合相关细节进行探讨,以gd32f450的官方用户手册和官方库函数为参考。stm32f429类似。
整体流程
在手册中层混合过程框图:
层0和层1可由具体的寄存器配置存储区,那么用户可以更改自己的显示类容。
BG层只有一个寄存器可以去配置单一的一种颜色。
目标层为混合后,在屏幕显示的类容。
如何混合
需要搞清楚手册中提供的混合公式。公式如下:
BC:最终混合出来的颜色
BF1:混合因子1
C:当前层颜色
BF2:混合因子2
Cs:下一级混合的颜色,对于层0就是BG层,对于层1就是层0和BG层混合后的零时层。
混合因子1和混合因子2可由对应层的混合寄存器配置计算方法:
说明:
恒定Alpha:可由层的恒定Alpha寄存器进行配置
归一化恒定Alpha:恒定Alpha / 255。
归一化的像素Alpha: 当像素带有透明度的时候,对于混合的结果可由像素去决定。
为何要归一化? 若两个像素混合相加的结果大于其颜色深度,该如何解决?归一化就是解决这个问题,两个像素按比例相加,这样就避免了这个问题。
举个例子
按照混合的顺序,需要把层0当作背景层,层1当作前景层。
对于层0,我们需要配置恒定Alpha为255,混合因子的计算方式为归一化的恒定Alpha,那么根据公式可得到:
BC=1*C +(1-1)*Cs=C
那么零时层就等于层0;达到了我们把层0当作背景的目的。
对于层1,我们需要配置恒定Alpha为255,混合因子的计算方式为归一化的像素Alpha乘以归一化的恒定Alpha,那么可分为两种情况:
若像素的Alpha为255:
BC=1*1*C+(1-1)*1*Cs=C
若像素的Alpha为0:
BC=0*1*C+(1-0)*1*Cs=Cs
可以发现,把层1需要显示的部分设为不透明,不需要显示的部分设为透明,即可与背景完美融合。
部分代码
层0和层1的配置:
tli_layer_init_struct.layer_window_leftpos = WINDOW_HOR_OFS;
tli_layer_init_struct.layer_window_rightpos = TLI_PIX_WIDTH - 1 + WINDOW_HOR_OFS;
tli_layer_init_struct.layer_window_toppos = WINDOW_VER_OFS;
tli_layer_init_struct.layer_window_bottompos =TLI_PIX_HEIGHT - 1 + WINDOW_VER_OFS;
tli_layer_init_struct.layer_ppf = LAYER_PPF_RGB565;
tli_layer_init_struct.layer_sa = 0xff;
tli_layer_init_struct.layer_default_blue = 0;
tli_layer_init_struct.layer_default_green = 0;
tli_layer_init_struct.layer_default_red = 0;
tli_layer_init_struct.layer_default_alpha = 0;
tli_layer_init_struct.layer_acf1 = LAYER_ACF1_PASA;
tli_layer_init_struct.layer_acf2 = LAYER_ACF2_PASA;
tli_layer_init_struct.layer_frame_bufaddr = (uint32_t)gImage_bg_buf;
tli_layer_init_struct.layer_frame_line_length = TLI_PIX_WIDTH*2+3;
tli_layer_init_struct.layer_frame_buf_stride_offset = TLI_PIX_WIDTH*2;
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_38974298/article/details/143730931
|