【超小型 Linux 开发套件Quantum Tiny Linux】移植tinygl实现3D显示
<div class='showpostmsg'> 本帖最后由 qinyunti 于 2024-7-20 13:39 编辑<p>源码如下</p>
<p> </p>
<div></div>
<p> </p>
<p> </p>
<p>视频</p>
<p>e59e016f76e0ea72b0458e724f19f86f<br />
</p>
<p>b站视频</p>
<p><iframe allowfullscreen="true" frameborder="0" height="450" src="//player.bilibili.com/player.html?bvid=1aE8ue2EHE&page=1" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
</p>
<p>微信公众号视频</p>
<p><a href="https://mp.weixin.qq.com/s/l_d1UUTtCxGflp7SXGLIXw">移植tinygl实现3D显示-基于Quantum开发板 (qq.com)</a><br />
<a href="https://mp.weixin.qq.com/s/l_d1UUTtCxGflp7SXGLIXw" target="_blank">视频号</a></p>
<ul>
<li><b>前言</b></li>
</ul>
<p>前面我们基于fb实现了ftf操作接口,现在开始就可以移植各种GUI了,</p>
<p>我们前面实现了mpu6050的角度获取,后面就可以实现角度的3D显示。</p>
<p>这一篇我们先来移植tinygl为3D显示做准备。</p>
<p> </p>
<p>Tinygl项目网站见<a href="https://bellard.org/TinyGL/" target="_blank">https://bellard.org/TinyGL/</a></p>
<p> </p>
<p>Tinygl是OpenGL的一个嵌入式实现子集</p>
<p> </p>
<p>下载代码</p>
<p>git clone <a href="https://github.com/jserv/tinygl" target="_blank">https://github.com/jserv/tinygl</a></p>
<p> </p>
<p>或者直接下载打包源码</p>
<p><a href="https://bellard.org/TinyGL/TinyGL-0.4.1.tar.gz"><u>https://bellard.org/TinyGL/TinyGL-0.4.1.tar.gz</u></a></p>
<p> </p>
<p>将TinyGL-0.4.1.tar.gz导入到开发板</p>
<p> </p>
<p>解压</p>
<p>tar -xvf TinyGL-0.4.1.tar.gz</p>
<p> </p>
<p>cd TinyGL</p>
<p> </p>
<p>make</p>
<p> </p>
<p> </p>
<p>可以看到能够编译,</p>
<p>但是默认需要x X display,所以我们需要移植到我们的tft显示,使用之前的基于fb的lcd接口封装。</p>
<p> </p>
<p> </p>
<p>删除不必要的文件最终目录如下</p>
<p> </p>
<p> </p>
<p> </p>
<p>复制examples下raw下的gears.c样例程序进行修改。</p>
<ul>
<li><b>接口移植</b></li>
</ul>
<p>Tinygl显示基于buffer,即最终显示内容是写入buffer的</p>
<p>初始化 ZB_open返回帧buffer,frameBuffer</p>
<p> // initialize TinyGL</p>
<p> ZBuffer *frameBuffer = ZB_open(winSizeX, winSizeY,</p>
<p>#if TGL_FEATURE_RENDER_BITS == 32</p>
<p> ZB_MODE_RGBA,</p>
<p>#else</p>
<p> ZB_MODE_5R6G5B,</p>
<p>#endif</p>
<p> 0);</p>
<p> if (!frameBuffer) {</p>
<p> printf("\nZB_open failed!");</p>
<p> exit(1);</p>
<p> }</p>
<p> glInit(frameBuffer);</p>
<p> </p>
<p> </p>
<p> </p>
<p>需要刷新显示时将帧frameBuffer拷贝出来到imbuf,然后显示imbuf即可</p>
<p> ZB_copyFrameBuffer(frameBuffer, imbuf, winSizeX * sizeof(PIXEL));</p>
<p>或者直接修改 ZB_copyFrameBuffer</p>
<p>将frameBuffer直接写入用户的显存,无需再经过imbuf中转,减少一次内存拷贝。</p>
<p> </p>
<p>这里在原来lcd.c上增加一个接口</p>
<p>int lcd_fill(uint8_t* buffer)</p>
<p>{</p>
<p> memcpy(s_fbp, buffer, s_vinfo.xres*s_vinfo.yres*s_vinfo.bits_per_pixel / 8);</p>
<p>}</p>
<p> </p>
<p>如下进行显示</p>
<p> ZB_copyFrameBuffer(frameBuffer, imbuf, winSizeX * sizeof(PIXEL));</p>
<p> lcd_fill((uint8_t*)imbuf);</p>
<p> </p>
<ul>
<li><b>配置</b></li>
</ul>
<p>修改显示的位宽,我们这里是16位</p>
<p>\include\zfeatures.h下修改</p>
<p>#define TGL_FEATURE_16_BITS 0</p>
<p>#define TGL_FEATURE_32_BITS 1</p>
<p> </p>
<p>为</p>
<p>#define TGL_FEATURE_16_BITS 0</p>
<p>#define TGL_FEATURE_32_BITS 0</p>
<p> </p>
<p> </p>
<ul>
<li><b>测试</b></li>
</ul>
<p>编译</p>
<p>gcc tinygl/src/*.c gears.c lcd.c -I tinygl/include/ -o gears -lm</p>
<p> </p>
<p> </p>
<p>运行</p>
<p> ./gears</p>
<p> </p>
<p>测试效果见视频</p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]