首页 > 其他分享 >Avalonia 跨平台框架中如何以正确的姿势使用 OpenGL ES 渲染。

Avalonia 跨平台框架中如何以正确的姿势使用 OpenGL ES 渲染。

时间:2024-02-29 15:33:05浏览次数:32  
标签:ANGLE complete OpenGL 跨平台 gl ES Avalonia

前言

这是一篇很水的文章,没有任何技术含量,在 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 渲染。)

参考

标签:ANGLE,complete,OpenGL,跨平台,gl,ES,Avalonia
From: https://www.cnblogs.com/xymfblogs/p/18044363

相关文章

  • kubernetes的pod中获取客户端真实ip
    kubernetes的pod中获取客户端真实ip在Kubernetes中,Pod拿到的远程IP是Kubernetes集群内部的IP,而不是客户端的真实IP。这是由于Kubernetes的网络模型和网络配置方式导致的。Kubernetes使用了一种称为"Service"的抽象来提供网络连接和负载均衡功能。当您创建一个Ser......
  • PostgreSQL从小白到高手教程 - 第45讲:poc-tpcc测试
       PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第45讲:POC-TPCC测试 PostgreSQL第45讲:3月2日(周六)......
  • HttpWebRequest的Request.Form接收不到数据
    最近在写接口,post请求,使用postman模拟时,使用的是raw-json,然后发现HttpContextBasecontext=(HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBaserequest=context.Request;//定义传统request对象stringdbcode=request.Form["d......
  • Codeforces 451E Devu and Flowers
    首先考虑没有\(f_i\)的限制的时候,此时可以用插板法得到方案数为\(\binom{s+n-1}{n-1}\)。考虑钦定\(f_i\)不合法,那么就相当于先在\(i\)这里选\(f_i+1\),剩下的随意分配,方案数就为\(\binom{s-(f_i+1)+n-1}{n-1}\)。算完过后能发现会算重存在\(>1\)......
  • Hbase服务启动异常(hbase-ams-master.pid doesn‘t exist)
    1.问题描述部署完hbase之后启动服务发现报错,报错信息为hbase-ams-master.piddoesn‘texist2.问题排查查看错误日志/var/log/hbase/hbase-hbase-master-khd-sd-b2k-hbase--ca83.out和hbase-hbase-master-khd-sd-b2k-hbase--ca83.log日志发现ERRORunningmaster,loggingt......
  • 学习之Session
    1.3.2HttpSession的使用用户提交form表单到ServletA,携带用户名,ServletA获取session将用户名存到Session,用户再请求其他任意Servlet,获取之间存储的用户定义表单页,提交用户名,提交后<formaction="servletA"method="post">用户名:<inputtype=......
  • Bad Request
    错误的请求方法HTTP协议定义了一些常见的请求方法,例如GET、POST、PUT、DELETE等。服务器根据不同的请求方法执行相应的操作。如果客户端使用了服务器不支持的请求方法,服务器将返回400BadRequest错误。为了解决这个问题,客户端需要使用服务器支持的请求方法。错误的请求体格式请......
  • 解析HTTP错误码400 Bad Request及其常见原因与解决方法
    解析HTTP错误码400BadRequest及其常见原因与解决方法1.引言在进行web开发过程中,我们经常会遇到各种HTTP错误码。HTTP错误码用于表示服务器对请求的响应状态,帮助我们定位和解决问题。本文将重点解析HTTP错误码400BadRequest,探讨其常见原因和解决方法。HTTP错误码的作用和分类......
  • SqlServer Express远程访问
     参考链接:https://blog.csdn.net/qq_42080586/article/details/108867215  1、在SQLServer配置管理器->SQLServer网络配置->MSSQLSERVER的协议中,启用NamedPipes和TCP/IP      2、打开允许远程连接  ......
  • 解析HTTP错误码400 Bad Request及其常见原因与解决方法
    解析HTTP错误码400BadRequest及其常见原因与解决方法1.引言在进行web开发过程中,我们经常会遇到各种HTTP错误码。HTTP错误码用于表示服务器对请求的响应状态,帮助我们定位和解决问题。本文将重点解析HTTP错误码400BadRequest,探讨其常见原因和解决方法。HTTP错误码的作用和分类......