前言

这是一篇很水的文章,没有任何技术含量,在 Github 已经有很多人对 AvaloniaOpenGL ES 支持进行了讨论,但是我还是想写一篇文章来记录一下我是如何在 Avalonia 中使用 OpenGL ES 的。

介绍

在介绍 AvaloniaOpenGL ES 之前,我们先来了解一下什么是 AvaloniaOpenGL ES 以及 Avalonia 是如何支持 OpenGL ES 的。

Angle 和 OpenGL ES

ANGLE 是一个开源的项目,它的目标是将 OpenGL ES 2.0、3.03.1 应用程序转换为 Direct3D 11VulkanMetalOpenGL 3.0+ 应用程序。

ANGLE 通过将 OpenGL ES API 调用转换为 Direct3DVulkanMetal API 调用来实现这一目标。

ANGLE 也提供了一个实现 OpenGL ES 2.0、3.03.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 平台的 XAMLC#UI 框架,它的目标是创建一个跨平台的 UI 框架,支持 WindowsLinuxMacOS。(摘自 Avalonia 官网)

Avalonia 渲染 API 的实现是基于 SkiaSharp 的,SkiaSharpGoogleSkia 图形库的 .NET 实现。

为了实现硬件加速 SkiaSharp 是支持 OpenGLOpenGL 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 ESContext 以及函数指针了。

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 ESContext 是在 OpenGlControlBaseOnOpenGlInit 方法中创建的,所以在 OnOpenGlRender 方法中使用 OpenGL ES 的函数指针的时候需要注意 Context 是否已经创建了。

其次,OpenGL ESContext 是线程相关的,所以在使用 OpenGL ES 的时候需要注意 Context 的线程问题。

在使用 OpenGL ES 扩展的时候要注意 ANGLE 是否支持该扩展,如果不支持的话需要自己去实现。

演示项目

  • GraphicsHostAppAvaloniaOpenGL ES 的演示项目,介绍了如何使用 C#C++ 来实现 OpenGL ES 渲染。)

参考

Avalonia 跨平台框架中如何以正确的姿势使用 OpenGL ES 渲染。的更多相关文章

  1. (ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载

    (一) 接需求  :   需求相关   (贴图 ) 生成三核对文件 1.新增三核对菜单页面中,增加生成三核对文件功能按钮,弹窗可根据变电站.电压等级查询定值单. 2.定值单信息以表格形式展示,根据选择 ...

  2. Android 中建立一个OpenGL ES的开发环境

    转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...

  3. 在Android中使用OpenGL ES进行开发第(一)节:概念先行

    一.前期基础是知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGL ES绘制 ...

  4. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    上一章回顾:  .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...

  5. .NET跨平台框架选择之一 - Avalonia UI

    本文阅读目录 1. Avalonia UI简介 Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行, ...

  6. 移动应用跨平台框架江湖将现终结者?速来参拜来自Facebook的React Native

    React Native使用初探 February 06 2015 Facebook让所有React Conf的参与人员都可以初尝React Native的源码---一个编写原生移动应用的方法.该方法 ...

  7. 一文读懂跨平台框架 Flutter 的搭建与运行

    作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架. 之前我们为大 ...

  8. 跨平台框架与React Native基础

    跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...

  9. Spring MVC中Session的正确用法<转>

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  10. 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

    推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...

随机推荐

  1. java -D的一些学习和使用

    背景 java开发的程序有很多进行配置的方式 可以通过 yaml文件或者是xml文件 也可以通过环境变量的方式. 1. 容器的话可以使用 -e 或者是env进行注入 2. K8S的话可以通过 conf ...

  2. 公司内部Oracle RAC测试环境的简单使用说明.

    1. 公司内部要测试Oracle RAC系统的创建与测试工作. 因为Oracle RAC 主要需要 多个网段以及共享存储, 直接使用ESXi搭建比较复杂 所以我这边使用vagrant的方式搭建Orac ...

  3. IIS 实现autoindex的简单方法 能够下载文件等.

    之前使用nginx 的autoindex on 的参数 能够实现了 nginx的 目录浏览查看文件 但是那是linux上面的 windows 上面很多 使用的 其实是 iis的居多 然后看了下 其实也 ...

  4. css伪类和伪元素在项目中的使用-红色*显示

    CSS使用伪类给表单添加星号 <style type="text/css"> .form-item label::before { content: '*'; colo ...

  5. c++ container容器(string,vector,map,queue,stack等等)

    STL和c++标准库 标准模板库STL部分包含在C++标准库中的软件库. c++标准库:即以std::开头,但是部分编译器厂商也会把STL的内容放在std:: namespace里面 由于一个常见的误 ...

  6. TienChin-课程管理-添加课程接口

    CourseController.java @PreAuthorize("hasPermission('tienchin:course:create')") @Log(title ...

  7. MiniRBT中文小型预训练模型:结合了全词掩码技术和两段式知识蒸馏技术,加快推理速度

    MiniRBT中文小型预训练模型:结合了全词掩码(Whole Word Masking)技术和两段式知识蒸馏(Knowledge Distillation)技术,加快推理速度 在自然语言处理领域中,预 ...

  8. Linux 统计Web服务日志命令

    本人在Linux运维中收集的一些通用的统计,Apache/Nginx服务器日志的命令组合. Apache日志统计 # 列出当天访问次数最多的IP命令 [root@lyshark.cnblogs.com ...

  9. 微服务保护-Sentinel

    1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务. 如图,如果服务提供者I发生了故障,当前的应用的部分业 ...

  10. iOS安装包瘦身总结

    前段时间APP要做资源压缩,需要把项目中使用的所有图片资源进行压缩,以减小APP安装包体积.想着既然压缩APP资源是为了缩小APP体积,那么来一遍APP整体瘦身流程并做一下总结吧. 整个过程分三步: ...