AWTK 如何用 OpenGL 绘制图形

news2024/9/21 12:39:46

在有 GPU 的情况下,AWTK 使用 OpenGL 绘制图形。但是你会发现,如果自己在 paint 事件中使用 OpenGL 绘制图形,图形是无法显示的。原因是,AWTK 采用 nanovg 绘制图形,而 nanovg 并不是在绘制时立即执行的,而是在整个界面绘制完成 (EndFrame 中)集中提交给 GPU 执行的。所以,如果在 paint 事件中使用 OpenGL 绘制图形,这些图形会被 nanovg 绘制的图形覆盖掉。这里我们介绍一下,使用 OpenGL 绘制图形时的几个注意事项:

在这里插入图片描述

1. 需要提交前面的缓存图形

在使用 OpenGL 绘制之前,需要调用函数 vgcanvas_flush 刷新前面的缓存图形。

示例:

static ret_t on_paint(void* ctx, event_t* e) {
  gl_info_t* info = &g_gl_info;
  paint_event_t* evt = paint_event_cast(e);
  vgcanvas_t* vg = canvas_get_vgcanvas(evt->c);
  return_value_if_fail(vg != NULL, RET_BAD_PARAMS);

  vgcanvas_flush(vg);

  glview_render_triangle(info, info->triangle1_vao);
  glview_render_triangle(info, info->triangle2_vao);

  return RET_OK;
}

2. 需要初始化 OpenGL

在 Windows 平台,需要调用 opengl_init 初始化 OpenGL。

示例:

static ret_t glview_init(gl_info_t* info) {
#ifdef WIN32
  opengl_init();
#endif/*WIN32*/

  float triangle1_vertices[] = { 
      -0.5f, -0.5f, 0.0f, 
      0.5f,  -0.5f, 0.0f,
      0.0f,  0.5f,  0.0f
  };  

  float triangle2_vertices[] = { 
      -0.5f, -1.0f, 0.0f, 
      0.5f,  -1.0f, 0.0f,
      0.0f,  -0.5f, 0.0f
  };  

  info->program = glhelper_create_program(s_vertexShaderSource, s_fragmentShaderSource);
  info->triangle2_vao = glhelper_create_vao(triangle1_vertices, 3); 
  info->triangle1_vao = glhelper_create_vao(triangle2_vertices, 3); 

  return RET_OK;
}

3. 需要链接 glad 库

env.Program(os.path.join(BIN_DIR, 'demo_opengl'), ['opengl.c', 'assets.c'], LIBS=env['LIBS'] + ['glad'])

完整示例请参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Visual Studio Code:让你的工作效率飞升的秘密武器

在现代软件开发环境中,效率已成为每个开发者追求的目标。而在众多编程工具中,Visual Studio Code(简称VS Code)凭借其强大的功能、轻量的界面和高度的可定制性,成为了全球开发者的首选。无论你是编写前端代码、后端服务…

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM data_file [ WITH ( [ [ , ] BATCHSIZE batch_size ] [ [ , ] CHECK_CONSTRAINTS …

WIN11 ESP32 IDF + VSCODE 环境搭建[教程向]

前言 目录 前言 安装ESP32-IDF VSCODE插件安装 编译测试 很多时候我们想学习一门新的技能,需要使用全新的开发环境,很多时候我们会在安装环境这个环节卡住很久,这里简单介绍一下ESP32VSCODE环境搭建。 安装ESP32-IDF https://dl.espre…

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠&am…

热度DA!《黑神话:悟空》专题合集|4K电影及天命人资料免费领取!

热度DA!《黑神话:悟空》专题合集|4K电影及天命人资料免费领取! 前言《黑神话:悟空》专题合集 前言 《黑神话:悟空》正式全球解锁上线,这一中国首款 “3A” 游戏的发布,瞬间点燃了无…

MonoHuman: Animatable Human Neural Field from Monocular Video 翻译

MonoHuman:来自单目视频的可动画人类神经场 摘要。利用自由视图控制来动画化虚拟化身对于诸如虚拟现实和数字娱乐之类的各种应用来说是至关重要的。已有的研究试图利用神经辐射场(NeRF)的表征能力从单目视频中重建人体。最近的工作提出将变形…

【Netty】netty中都是用了哪些设计模式

对于工程师来说,掌握并理解运用设计模式,是非常重要的,但是除了学习基本的概念之外,需要结合优秀的中间件、框架源码学习其中的优秀软件设计,这样才能以不变应万变。 单例模式 单例模式解决的对象的唯一性&#xff0…

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人…

B端产品经理的流程设计思维

回首入行产品经理也已多年,做的项目也由C到B,由前到后都已涉及,辗转跨行仍觉互联网学海无涯,还是需要保持输出。思前想后还是决定聊一聊在过往服务多家大型集团的工作经历中十分重要,但却普遍不被视为产品经理必备能力…

Spring-循环依赖

预备知识 循环依赖开关(方法) - AbstractAutowireCapableBeanFactory#setAllowCircularReferences 单例工程(属性) - DefaultSingletonBeanRegistry#singletonFactories获取早期未处理Bean (方法) - AbstractAutowireCapableBeanFactory#getEarlyBeanReference早期未处理Bean…

项目实战系列: 家居购项目 第一部分

家居购项目 🐀Java后端经典三层架构🐇MVC模型🐇开发环境搭建🐇会员注册🍉前端JS校验🍉后端实现 🐇会员登陆 🐀Java后端经典三层架构 分层对应包说明web层com.zzw.furns.web/servlet/…

【PyQt6 应用程序】直播素材视频循环生成

在现代内容创作中,视频素材的生成和处理变得越来越重要,尤其是在直播、视频剪辑等场景中。对于需要长期、持续生成内容的用户来说,如何有效地利用现有的视频素材,生成长时间播放且无明显重复感的视频片段,是一个亟待解决的问题。 本教程将详细讲解如何使用 PyQt6 来实现一…

tabBar设置底部菜单选项以及iconfont图标

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…

欧拉系统安装 NVIDIA 显卡驱动

1、安装显卡驱动编译工具 yum install gcc make kernel-devel 2、安装显卡驱动依赖包 yum install vulkan-loader 可选安装项,不安装该系统包时会出现以下警告提示,但不影响安装和使用。 3、安装 NVIDIA GPU 驱动 生产环境建议选择 .run 格式的驱动…

Java线程池和Executor框架-面试与分析

线程池 什么是线程池?为什么要用线程池? 在Java并发框架中,线程池时使用最多的东西,几乎所有需要异步并发执行任务的程序都可以使用线程池。 使用线程池带来的好处: 降低资源消耗。通过重复利用已创建的线程降低线程…

基于Java语言的充电桩系统+充电管理平台+云快充协议+云快充协议1.5+桩直连协议+云快充协议源码

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议,版本为云快充1.5,对于没有对接过充电桩系统的开发者尤为合适; 2、包含:启…

文心一言功能新升级:读文档、懂翻译、能识图

9月4日,百度文心一言官网显示,在向全社会开放一周年之际,文心一言进行了功能最新全面升级,同时在周年期间为新老会员增加1个月专业版免费使用体验。 据了解,针对网页版用户需求,文心一言实现了创作内容更加…

Linux-进程管理【重点】

前言 Linux操作系统在虚拟机VM上的安装【CentOS版本】-CSDN博客 Linux-(系统启动、用户管理)-CSDN博客 Linux-实用指令-CSDN博客 Linux-【组管理、权限管理、定时任务调度】-CSDN博客 进程管理 在linux中,每个执行的程序都成为一个进程,每一个进程都…

玩转Python Turtle库,实现满屏飘字的魔法!

前言 本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Py…

在OpenEuler(欧拉)系统上用kubeadm部署(k8s)Kubernetes集群

一、OpenEuler(欧拉) 系统简介 openEuler 是开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目; openEuler作为一个操作系统发行版平台,每两年推出一个LTS版本。该版本为企业级用户提供一个安全稳定可靠的操作系统。…