【 NXP i.MX RT1170 】VGLite 图形API 的介绍与例程

关键字 :i.MX RT1170nxp

一、GPU2D 图形处理单元

1.1 GPU2D 概述

      2D GPU 由矢量图形等组件组成引擎,是用于执行各种图像处理的成像引擎。它支持矢量图形加速的 OpenVG 1.1 API 标准和 VGLite 图形 API。

      OpenVG 为 Flash 和 SVG (Scalable Vector Graphics ) 矢量图形库等提供了低级硬件加速接口,它用于在小屏幕设备上加速用户界面和文本的高质量矢量图形。

      GPU 也可以与 VGLite 图形 API 一起使用,设计 VGLite 图形 API 是为了优化了系统的总体资源需求,目标是提供最大的性能,同时保持内存占用率为最少。

二、 VGLite 图形 API 概述

      VGLite 是一个轻量级的 2D 图形 API,其设计目的是具有较小的内存占用和较低的 CPU 占用率,VGLite 上的两个主要绘图函数是 vg_lite_draw,它呈现矢量源图形,以及 vg_lite_blit,它呈现位图也称为光栅图像。

2.1 OpenVG API、VGLite API 功能对比

      对比可以看出 VGLite 在功能与 OpenVG 相似的情况下,驱动具有较小的内存占用的特点。

2.2 VGLite 图形API 功能

  • 支持 2D 矢量和 2D 光栅操作,用于呈现交互式用户界面包括菜单、字体、曲线和图像。
  • 提供最大的 2D 矢量/光栅渲染性能
  • 保持内存占用最小
  • GPU 支持多个并行任务同时绘图
  • 支持功能包括,Porter-Duff 混合、梯度控制、任意旋转、路径填充规则、路径绘画和模式路径填充。

2.3 VGLite 渲染矢量图形

       VGLite 渲染图形要素

       使用 VGLite 渲染矢量图形,需要以下六个要素信息:

       1、目标:这是将保存生成的渲染图像的目标缓冲区。
       2、路径数据:由一组坐标和路径段组成,这些坐标和路径段定义了将要呈现。
       3、填充规则:指定选择的方案以纯色填充几何形状。
       4、变换:通过 3x3 矩阵提供仿射变换。
       5、颜色:使用 32bpp 值(alpha,红色,绿色和蓝色,每个使用八位)定义路径颜色。每个像素路径所覆盖的区域将具有此颜色。
       6、混合规则:将根据这些规则将路径混合到扩展缓冲区内容。

三、VGLite 例程获取

3.1 SDK 获取

SDK 可在 NXP 官网根据需求添加部件自定义生成 SDK,NXP MCUXpresso SDK Builder 的链接如下 https://mcuxpresso.nxp.com/en/welcome

3.2 创建工程

      文件 -> Import SDK Examples -> evkimxrt1170 -> driver_examples -> lcdifv2 ->  选择 vector_freertos_cm7。

      需要留意新工程中 doc -> readme.txt 中的注意事项,本次使用的开发板配套的屏幕是 RK055AHD091 屏幕,所以需要修改工程 board -> lcdifv2_support.h 中的用户 MIPI 面板宏定义为 #define USE_MIPI_PANEL MIPI_PANEL_RK055AHD091。



四、VGLite 渲染图形应用例程

4.1 例程中 VGLite 渲染图形要素

      vg_lite_draw(rt, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_NONE, 0xFF0000FF);

 
4.1.1 目标 rt

      用于任何图像或渲染目标的包装器结构,vg_lite_buffer_t *rt = VGLITE_GetRenderTarget(&window);

4.1.2 路径数据 path

      如上文 2.1 VGLite 渲染图形要素提及,这是由一组坐标和路径段组成要呈现的矢量图形,效果如注释所演示。

/*
*-----*
/ \
/ \
* *
| /
| X
| \
* *
\ /
\ /
*-----*
*/
static int8_t path_data[] = {
2, -5, -10, // moveto -5,-10

4, 5, -10, // lineto 5,-10
4, 10, -5, // lineto 10, -5
4, 0, 0, // lineto 0, 0
4, 10, 5, // lineto 10, 5
4, 5, 10, // lineto 5, 10
4, -5, 10, // lineto -5, 10
4, -10, 5, // lineto -10, 5
4, -10, -5, // lineto -10, -5
0, // end
};


4.1.3 填充规则 VG_LITE_FILL_EVEN_ODD

      对于绘制任意路径,硬件支持非零填充规则和奇偶填充规则。

typedef enum vg_lite_fill {
VG_LITE_FILL_NON_ZERO, /*! Non-zero fill rule. A pixel is drawn if it crosses at least one path pixel. */
VG_LITE_FILL_EVEN_ODD, /*! Even-odd fill rule. A pixel is drawn it it crosses an odd number of path pixels. */
} vg_lite_fill_t;

 

4.1.4 转换matrix

      转换是 GPU 的强大功能,它将 2D 仿射变换定义 3x3 矩阵(仿射变换是线性变换,实现缩放、平移),它还使我们能够描述投影变换。

vg_lite_identity(&matrix);
vg_lite_translate(window.width / 2.0f, window.height / 2.0f, &matrix);
vg_lite_scale(10, 10, &matrix);

 

4.1.5 颜色 0xFF0000FF

    VGLite 渲染图形所支持图像编码格式如下图所示,编码格式 R G B 像素与透明通道的布局如图右边所示。




4.1.6 混合规则 VG_LITE_BLEND_NONE

      图像混合模式,S 和 D 表示源图像和目标图像的颜色通道。

typedef enum vg_lite_blend {
VG_LITE_BLEND_NONE, /*! S, i.e. no blending. */
VG_LITE_BLEND_SRC_OVER, /*! S + (1 - Sa) * D */
VG_LITE_BLEND_DST_OVER, /*! (1 - Da) * S + D */
VG_LITE_BLEND_SRC_IN, /*! Da * S */
VG_LITE_BLEND_DST_IN, /*! Sa * D */
VG_LITE_BLEND_SCREEN, /*! S + D - S * D */
VG_LITE_BLEND_MULTIPLY, /*! S * (1 - Da) + D * (1 - Sa) + S * D */
VG_LITE_BLEND_ADDITIVE, /*! S + D */
VG_LITE_BLEND_SUBTRACT, /*! D * (1 - S) */
} vg_lite_blend_t;

 

4.2 演示效果

      使用 VGLite 由六个要素信息渲染矢量图形如下图所示。



五、参考资料

      【 i.MX RT 驱动 LCD 详解 】
          https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=616702

      【i.MX RT1170 Processor Reference Manual】
            i.MX RT1170 Processor Reference Manual (nxp.com.cn) 

       【i.MX RT1170异构图形管线
           https://www.nxpic.org.cn/module/forum/thread-621465-1-1.html

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论