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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...