Avalonia 跨平臺框架中如何以正確的姿勢使用 OpenGL ES 渲染。

来源:https://www.cnblogs.com/xymfblogs/p/18044363
-Advertisement-
Play Games

前言 這是一篇很水的文章,沒有任何技術含量,在 Github 已經有很多人對 Avalonia 的 OpenGL ES 支持進行了討論,但是我還是想寫一篇文章來記錄一下我是如何在 Avalonia 中使用 OpenGL ES 的。 介紹 在介紹 Avalonia 和 OpenGL ES 之前,我們先 ...


前言

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

參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述:JSON Web Token(JWT)是一種用於安全傳輸信息的標準。主要用於身份驗證和信息傳遞,通過頭部、載荷和簽名構成。在.NET Core中,可通過Microsoft.AspNetCore.Authentication.JwtBearer實現後臺服務,提供生成、刷新和驗證Token的介面。 ...
  • NuGet下載Flurl FlurlHttpClient類 public class FlurlHttpClient { private readonly FlurlClient client; public FlurlHttpClient(FlurlClient client) { this.cl ...
  • 上一篇中,老周簡單膚淺地介紹了 XInput API 的使用,並模擬了滑鼠移動,左、右鍵單擊和滾輪。本篇,咱們用 .NET 代碼來完成相同的效果。 說起來也是倒霉,博文寫了一半,電腦忽然斷電了。不知道什麼原因,可能是 UPS 電源出故障。重新開機進來一看,博文沒有自動保存到草稿箱。我記得以前是有自動 ...
  • 通過本篇教程,我們學習瞭如何在 Taurus.MVC WebMVC 中使用部分視圖和頁面片段來提高代碼的復用性和可維護性。我們瞭解了部分視圖和頁面片段的基本概念,並學習瞭如何創建和使用它們。 ...
  • 已知在OpenXml有以下幾種超鏈接 功能 說明 跳轉頁面 跳轉某一頁:ppaction://hlinksldjump跳轉第一頁:ppaction://hlinkshowjump?jump=firstslide跳轉最後一頁:ppaction://hlinkshowjump?jump=lastslid ...
  • 目錄 一、簡介 二、創建gRPC服務端 1.創建gRPC項目 2.編寫自己的服務 三、創建gRPC客戶端 1.創建客戶端項目 2.grPC服務https的調用 3.gRPC內網http調用 4.IOC註入的方式調用gRPC 四、webapi中加入gRPC 回到頂部 一、簡介 簡單解析一下gRPC,g ...
  • 通過本篇教程,我們學習瞭如何在 Taurus.MVC WebMVC 中配置路由並將其映射到控制器和操作方法。我們學習了預設路由和自定義路由的創建方法,並瞭解了不同 URL 對控制器和操作方法的影響。 ...
  • 本章將和大家分享 Elasticsearch 的一些基本操作。話不多說,下麵我們直接進入主題。 一、索引庫操作 1、settings屬性 settings屬性可以設置索引庫的一些配置信息,例如:配置分片數和副本數、配置自定義分詞器等。 其中分片數量只能在一開始創建索引庫的時候指定,後期不能修改。副本 ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...