本帖最后由 qinyunti 于 2024-7-20 13:39 编辑
源码如下
视频
feb906e36f1749077ddea1187ea43a16
b站视频
微信公众号视频
移植tinygl实现3D显示-基于Quantum开发板 (qq.com)
视频号
前面我们基于fb实现了ftf操作接口,现在开始就可以移植各种GUI了,
我们前面实现了mpu6050的角度获取,后面就可以实现角度的3D显示。
这一篇我们先来移植tinygl为3D显示做准备。
Tinygl项目网站见https://bellard.org/TinyGL/
Tinygl是OpenGL的一个嵌入式实现子集
下载代码
git clone https://github.com/jserv/tinygl
或者直接下载打包源码
https://bellard.org/TinyGL/TinyGL-0.4.1.tar.gz
将TinyGL-0.4.1.tar.gz导入到开发板
解压
tar -xvf TinyGL-0.4.1.tar.gz
cd TinyGL
make
可以看到能够编译,
但是默认需要x X display,所以我们需要移植到我们的tft显示,使用之前的基于fb的lcd接口封装。
删除不必要的文件最终目录如下
复制examples下raw下的gears.c样例程序进行修改。
Tinygl显示基于buffer,即最终显示内容是写入buffer的
初始化 ZB_open返回帧buffer,frameBuffer
// initialize TinyGL
ZBuffer *frameBuffer = ZB_open(winSizeX, winSizeY,
#if TGL_FEATURE_RENDER_BITS == 32
ZB_MODE_RGBA,
#else
ZB_MODE_5R6G5B,
#endif
0);
if (!frameBuffer) {
printf("\nZB_open failed!");
exit(1);
}
glInit(frameBuffer);
需要刷新显示时将帧frameBuffer拷贝出来到imbuf,然后显示imbuf即可
ZB_copyFrameBuffer(frameBuffer, imbuf, winSizeX * sizeof(PIXEL));
或者直接修改 ZB_copyFrameBuffer
将frameBuffer直接写入用户的显存,无需再经过imbuf中转,减少一次内存拷贝。
这里在原来lcd.c上增加一个接口
int lcd_fill(uint8_t* buffer)
{
memcpy(s_fbp, buffer, s_vinfo.xres*s_vinfo.yres*s_vinfo.bits_per_pixel / 8);
}
如下进行显示
ZB_copyFrameBuffer(frameBuffer, imbuf, winSizeX * sizeof(PIXEL));
lcd_fill((uint8_t*)imbuf);
修改显示的位宽,我们这里是16位
\include\zfeatures.h下修改
#define TGL_FEATURE_16_BITS 0
#define TGL_FEATURE_32_BITS 1
为
#define TGL_FEATURE_16_BITS 0
#define TGL_FEATURE_32_BITS 0
编译
gcc tinygl/src/*.c gears.c lcd.c -I tinygl/include/ -o gears -lm
运行
./gears
测试效果见视频