Avalonia 跨平台框架中如何以正确的姿势使用 OpenGL ES 渲染。
前言
这是一篇很水的文章,没有任何技术含量,在 Github 已经有很多人对 Avalonia 的 OpenGL ES 支持进行了讨论,但是我还是想写一篇文章来记录一下我是如何在 Avalonia 中使用 OpenGL ES 的。
介绍
在介绍 Avalonia 和 OpenGL ES 之前,我们先来了解一下什么是 Avalonia 和 OpenGL ES 以及 Avalonia 是如何支持 OpenGL ES 的。
Angle 和 OpenGL ES
ANGLE 是一个开源的项目,它的目标是将 OpenGL ES 2.0、3.0 和 3.1 应用程序转换为 Direct3D 11、Vulkan、Metal 和 OpenGL 3.0+ 应用程序。
ANGLE 通过将 OpenGL ES API 调用转换为 Direct3D、Vulkan 或 Metal API 调用来实现这一目标。
ANGLE 也提供了一个实现 OpenGL ES 2.0、3.0 和 3.1 的库,这样就可以在不支持 OpenGL ES 的平台上运行 OpenGL ES 应用程序。
以下是摘自 ANGLE 项目的介绍:
Level of OpenGL ES support via backing renderers
| Direct3D 9 | Direct3D 11 | Desktop GL | GL ES | Vulkan | Metal | |
|---|---|---|---|---|---|---|
| OpenGL ES 2.0 | complete | complete | complete | complete | complete | complete |
| OpenGL ES 3.0 | complete | complete | complete | complete | complete | |
| OpenGL ES 3.1 | [incomplete][ES31OnD3D] | complete | complete | complete | ||
| OpenGL ES 3.2 | in progress | in progress | complete |
Platform support via backing renderers
| Direct3D 9 | Direct3D 11 | Desktop GL | GL ES | Vulkan | Metal | |
|---|---|---|---|---|---|---|
| Windows | complete | complete | complete | complete | complete | |
| Linux | complete | complete | ||||
| Mac OS X | complete | complete [1] | ||||
| iOS | complete [2] | |||||
| Chrome OS | complete | planned | ||||
| Android | complete | complete | ||||
| GGP (Stadia) | complete | |||||
| Fuchsia | complete |
ANGLE 项目的地址:https://github.com/google/angle
Avalonia
Avalonia 是一个 .NET 平台的 XAML 和 C# 的 UI 框架,它的目标是创建一个跨平台的 UI 框架,支持 Windows、Linux 和 MacOS。(摘自 Avalonia 官网)
Avalonia 渲染 API 的实现是基于 SkiaSharp 的,SkiaSharp 是 Google 的 Skia 图形库的 .NET 实现。
为了实现硬件加速 SkiaSharp 是支持 OpenGL 和 OpenGL ES 渲染的,为了统一平台,Avalonia 选择了 ANGLE 作为 OpenGL ES 的实现。
Avalonia 项目的地址:https://github.com/AvaloniaUI/Avalonia
如何使用 OpenGL ES
Avalonia 中的 OpenGL ES 是通过 ANGLE 来实现的,在 Avalonia 项目中已经集成了 ANGLE,所以我们不需要再去关心 ANGLE 的集成问题。
在该框架中使用 OpenGL ES 的方式是通过 Avalonia 提供的 OpenGlControlBase 控件来实现的,我们只需要集成 OpenGlControlBase 控件并重写 OnOpenGlInit 方法就可以获取到 OpenGL ES 的 Context 以及函数指针了。
在 Avalonia 中使用 OpenGL ES 的步骤如下:(我这边使用的是 Silk.NET 来调用 OpenGL ES 的函数)
using Silk.NET.OpenGLES;
namespace GraphicsHostApp.Graphics.OpenGL;
public class Renderer : OpenGlControlBase, IGraphicsHost<GL>
{
private GL _gl;
protected override void OnOpenGlInit(GlInterface gl)
{
// 获取 OpenGL ES 的 函数指针。
_gl ??= GL.GetApi(gl.GetProcAddress);
// 后续初始化操作。
}
protected override void OnOpenGlDeinit(GlInterface gl)
{
// 释放 OpenGL ES 的资源。
Code ...
// 释放函数指针。
_gl.Dispose();
_gl = null;
}
protected override void OnOpenGlRender(GlInterface gl, int fb)
{
// 更新操作。
Code ...
// 渲染操作。 注:这里需要注意的是,父类代码并没有更新视口,所以需要手动更新视口。gl.Viewport(0, 0, Width, Height);
Code ...
// 提交渲染到主循环中。
Dispatcher.UIThread.Post(RequestNextFrameRendering, DispatcherPriority.Render);
}
}
结语
Avalonia 是一个很不错的 UI 框架,它的 OpenGL ES 支持也是很完善的,但是在使用 OpenGL ES 的时候需要注意的是 OpenGL ES 的 Context 是在 OpenGlControlBase 的 OnOpenGlInit 方法中创建的,所以在 OnOpenGlRender 方法中使用 OpenGL ES 的函数指针的时候需要注意 Context 是否已经创建了。
其次,OpenGL ES 的 Context 是线程相关的,所以在使用 OpenGL ES 的时候需要注意 Context 的线程问题。
在使用 OpenGL ES 扩展的时候要注意 ANGLE 是否支持该扩展,如果不支持的话需要自己去实现。
演示项目
- GraphicsHostApp (Avalonia 和 OpenGL ES 的演示项目,介绍了如何使用 C# 和 C++ 来实现 OpenGL ES 渲染。)

参考
Avalonia 跨平台框架中如何以正确的姿势使用 OpenGL ES 渲染。的更多相关文章
- (ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载
(一) 接需求 : 需求相关 (贴图 ) 生成三核对文件 1.新增三核对菜单页面中,增加生成三核对文件功能按钮,弹窗可根据变电站.电压等级查询定值单. 2.定值单信息以表格形式展示,根据选择 ...
- Android 中建立一个OpenGL ES的开发环境
转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...
- 在Android中使用OpenGL ES进行开发第(一)节:概念先行
一.前期基础是知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGL ES绘制 ...
- .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了
上一章回顾: .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...
- .NET跨平台框架选择之一 - Avalonia UI
本文阅读目录 1. Avalonia UI简介 Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行, ...
- 移动应用跨平台框架江湖将现终结者?速来参拜来自Facebook的React Native
React Native使用初探 February 06 2015 Facebook让所有React Conf的参与人员都可以初尝React Native的源码---一个编写原生移动应用的方法.该方法 ...
- 一文读懂跨平台框架 Flutter 的搭建与运行
作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架. 之前我们为大 ...
- 跨平台框架与React Native基础
跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...
- Spring MVC中Session的正确用法<转>
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制
推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...
随机推荐
- OpenGauss3.1.0 单机版安装部署过程
背景 由易到难 先进行单节点的设置 先说坑 openEuler2203 默认安装了python3.9 但是openGauss里面指代了3.6和3.7 /openGauss/install/om 注意在 ...
- es6数组方法find()、findIndex() filter()的总结
find()查找符合条件数组的元素(只能够找出第一个符合条件的) // 查找出大33的元素. // find查找第一个符合条件的数组元素(只查找出第一个 找不到返回undefined) // 它的参数 ...
- 【JS 逆向百例】网洛者反爬练习平台第二题:JJEncode 加密
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- TienChin 渠道管理-删除渠道
更改一下菜单权限,将删除渠道的 delete 改为 remove: ChannelController.java @PreAuthorize("hasPermission('tienchin ...
- React中引入外部js文件
假设需要引入本地的一个jquery库: <script src="http://127.0.0.1:8080/plugins/jquery.min.js" type=&quo ...
- gRPC学习小札
gRPC 前言 为什么使用gRPC 传输协议 传输效率 性能消耗 gRPC入门 gRPC流 证书认证 使用根证书 gRPC实现token认证 和Web服务共存 验证器 REST接口 grpcurl工具 ...
- 3.2 Windows驱动开发:内核CR3切换读写内存
CR3是一种控制寄存器,它是CPU中的一个专用寄存器,用于存储当前进程的页目录表的物理地址.在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成.页表是由页目录表和页表组成的,页目录表存储了页表的 ...
- 8.2 Windows驱动开发:内核解锁与强删文件
在某些时候我们的系统中会出现一些无法被正常删除的文件,如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉,而所谓的解锁其实就是释放掉文件描述符(句柄表)占用,文件解锁的核心原理是通过调用ObSet ...
- 21.10 Python 使用CRC32校验文件
CRC文件校验是一种用于验证文件完整性的方法,通过计算文件的CRC值并与预先计算的CRC校验值进行比较,来判断文件是否发生变化,此类功能可以用于验证一个目录中是否有文件发生变化,如果发生变化则我们可以 ...
- 5.1 内存CRC32完整性检测
CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏.通过运用本校验技术我们可以实现对特定内存区域以及磁 ...