OpenGL ES EGL eglCreatePbufferSurface

来源:https://www.cnblogs.com/shuopython/archive/2022/11/06/16863273.html
-Advertisement-
Play Games

目錄 一. EGL 前言 二. EGL 繪製流程簡介 三.eglCreatePbufferSurface 函數簡介 1.eglCreatePbufferSurface 簡介 2.eglCreatePbufferSurface 和 eglCreateWindowSurface 區別 四.eglCrea ...


目錄

零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎

零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效

零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 轉場

零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 函數

零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES GPUImage 使用

零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES GLSL 編程

一. EGL 前言

EGLNativeDisplayType – 系統顯示類型,標識你所開發設備的物理屏幕,DX/OPenGL ES/Metal/Vulkan….

EGLNativeWindowType – 系統視窗,渲染顯示的視窗句柄

EGLDisplay – 關聯 EGLNativeDisplayType 系統物理屏幕的通用數據類型,是平臺上 WGL / GLX / AGL 的等價物

EGLSurface – 渲染區域,相當於 OpenGL ES 繪圖的畫布 (一塊記憶體空間),用戶想繪製的信息首先都要先繪製到 EGLSurface 上,然後通過 EGLDisplay 顯示

EGLConfig – 對 EGLSurface 的 EGL 配置,可以理解為繪製目標 framebuffer 的配置屬性

EGLContextOpenGL ES 圖形上下文

二. EGL 繪製流程簡介

  1. 獲取 EGL Display 對象:eglGetDisplay
  2. 初始化與 EGLDisplay 之間的連接:eglInitialize
  3. 獲取 EGLConfig 對象:eglChooseConfig / eglGetConfigs
  4. 創建 EGLContext 實例:eglCreateContext
  5. 創建 EGLSurface 實例:eglCreateWindowSurface / eglCreatePbufferSurface
  6. 連接 EGLContext 和 EGLSurface:eglMakeCurrent
  7. 使用 OpenGL ES API 繪製圖形:gl_*
  8. 切換 front buffer 和 back buffer 顯示:eglSwapBuffer
  9. 斷開並釋放與 EGLSurface 關聯的 EGLContext 對象:eglRelease
  10. 刪除 EGLSurface 對象
  11. 刪除 EGLContext 對象
  12. 終止與 EGLDisplay 之間的連接

三.eglCreatePbufferSurface 函數簡介

1.eglCreatePbufferSurface 簡介

EGLSurface eglCreatePbufferSurface(
	EGLDisplay display, 		// 指定EGL顯示連接
        EGLConfig config, 		// 指定配置
        const EGLint *attribList)       // 指定像素緩衝區屬性

/*
attribList的屬性可以是:

EGL_HEIGHT:預設值為0。
EGL_LARGEST_PBUFFER:預設值為EGL_FALSE。
EGL_MIPMAP_TEXTURE:預設值為EGL_FALSE。
EGL_TEXTURE_FORMAT:預設值為EGL_NO_TEXTURE,還可以選擇EGL_TEXTURE_RGB或>EGL_TEXTURE_RGBA。
EGL_TEXTURE_TARGET:預設值為EGL_NO_TEXTURE,還可以選擇EGL_TEXTURE_2D。
EGL_VG_ALPHA_FORMAT:只適用於OpenVG,預設值為EGL_VG_ALPHA_FORMAT_NONPRE,>還可以選擇EGL_VG_ALPHA_FORMAT_PRE。
EGL_VG_COLORSPACE:只適用於OpenVG,預設值為EGL_VG_COLORSPACE_sRGB,還可以選>擇EGL_VG_COLORSPACE_LINEAR。
EGL_WIDTH:預設值為0。

*/

相關錯誤碼:

EGL_BAD_MATCH :提供了與視窗屬性不匹配的 EGLConfig,或該 EGLConfig 不支持渲染到視窗
EGL_BAD_CONFIG :提供的 EGLConfig 沒有得到系統支持
EGL_BAD_NATIVE_WINDOW :提供的原生視窗句柄無效
EGL_BAD_ALLOC :無法為新的視窗分配資源,或已經有和提供的原生視窗關聯的 EGLConfig

2.eglCreatePbufferSurface 和eglCreateWindowSurface區別

在文章 《OpenGL ES EGL 名詞解釋》有詳細介紹, EGLSurface 一共分為三類:

1.Surface – 可顯示的 Surface,實際上就是一個 FrameBuffer,用於綁定視窗後預覽顯示,通過 eglCreateWindowSurface 創建;

2.PixmapSurface – 不是可顯示的 Surface,保存在系統記憶體中的點陣圖;

3.PBufferSurface – 不是可顯示的 Surface,保存在顯存中的幀,用於離屏渲染,不需要綁定視窗通過 eglCreatePbufferSurface 創建

四.eglCreatePbufferSurface 使用

創建 PBufferSurface 和創建 EGL 視窗非常類似,只有少數微小的不同。為了創建 PBufferSurface,需要和視窗一樣找到 EGLConfig ,並作一處修改:我們需要擴增 EGL_SURFACE_TYPE 的值,使其包含 EGL_PBUFFER_BIT

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:OpenGL ES EGL eglCreatePbufferSurface
//@Time:2022/08/04 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/

	EGLint attribList[] = {
			EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,
			EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
			EGL_RED_SIZE, 5,
			EGL_GREEN_SIZE, 6,
			EGL_BLUE_SIZE, 5,
			EGL_DEPTH_SIZE, 1,
			EGL_NONE
	};

   // 查詢EGL錶面配置

	const EGLint MaxConfigs = 10;
	EGLConfig configs[MaxConfigs]; // We'll only accept 10 configs
	EGLint numConfigs;
	if (!eglChooseConfig(display, attribList, configs, MaxConfigs, &numConfigs)) {
		// Something didn't work … handle error situation
	} else {
		// Everything's okay. Continue to create a rendering surface
	}

    // Proceed to create a 512*512 pbuffer
	EGLSurface pbuffer;
	EGLint attribList2[] =
			{
					EGL_WIDTH, 512,
					EGL_HEIGHT, 512,
					EGL_LARGEST_PBUFFER, EGL_TRUE,
					EGL_NONE
			};

	pbuffer = eglCreatePbufferSurface(display, config, attribList2);

	if (pbuffer == EGL_NO_SURFACE) {
		switch (eglGetError()) {
			case EGL_BAD_ALLOC:
				// Not enough resources available. Handle and recover
				break;

			case EGL_BAD_CONFIG:
				// Verify that provided EGLConfig is valid
				break;

			case EGL_BAD_PARAMETER:
				// Verify that EGL_WIDTH and EGL_HEIGHT are non-negative values
				break;

			case EGL_BAD_MATCH:
				// Check window and EGLConfig attributes to determine
				// compatibility, or verify that the EGLConfig
				// supports rendering to a window,
				break;
		}
	}

	EGLint width;
	EGLint height;
	if(!eglQuerySurface( display,pbuffer,EGL_WIDTH,&width) ||
	   !eglQuerySurface( display,pbuffer,EGL_HEIGHT,&height))
	{
		//Unable to query surface information
	}

五.猜你喜歡

  1. OpenGL ES 簡介
  2. OpenGL ES 版本介紹
  3. OpenGL ES 2.0 和 3.0 區別
  4. OpenGL ES 名詞解釋(一)
  5. OpenGL ES 名詞解釋(二)
  6. OpenGL ES GLSL 著色器使用過程
  7. OpenGL ES EGL 簡介
  8. OpenGL ES EGL 名詞解釋
  9. OpenGL ES EGL eglGetDisplay
  10. OpenGL ES EGL eglInitialize
  11. OpenGL ES EGL eglGetConfigs
  12. OpenGL ES EGL eglChooseConfig
  13. OpenGL ES EGL eglGetError
  14. OpenGL ES EGL eglCreateContext
  15. OpenGL ES EGL eglCreateWindowSurface
  16. OpenGL ES EGL eglCreatePbufferSurface

本文由博客 - 猿說編程 猿說編程 發佈!


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

-Advertisement-
Play Games
更多相關文章
  • Fsm1 這裡需要實現一個簡單的摩爾狀態機,即輸出只與狀態有關的狀態機。 我這裡代碼看上去比長一點,答案用的case和三目運算符,結果是一樣的。 module top_module( input clk, input areset, // Asynchronous reset to state B ...
  • 看《C++ Primer Plus》時整理的學習筆記,部分內容完全摘抄自《C++ Primer Plus》(第6版)中文版,Stephen Prata 著,張海龍 袁國忠譯,人民郵電出版社。只做學習記錄用途。 ...
  • 前言 ​ 對於我們平時寫代碼運行,我們很少去關註編譯和鏈接的過程,因為現在的開發環境都是集成(IDE)的,這些IDE一般都會將編譯和鏈接的過程一步搞定,這一過程又被稱為構建。但若經常寫代碼,經常會有很多莫名其妙的錯誤讓我們不知所措,對於這些錯誤若我們能知其原因,那是再好不過了。因此本系列就是帶你瞭解 ...
  • C++ 類:實體的抽象類型 實體(屬性,行為) ->ADT(abstract data type) 類(屬性->成員變數,行為->成員方法) OOP語言4大特征 抽象 封裝/隱藏(通過public private protected) 繼承 多態 點擊查看代碼 class Student{ //屬性 ...
  • 免費課頁面前端搭建 點擊查看代碼 <template> <div class="course"> <Header></Header> <div class="main"> <!-- 篩選條件 --> <div class="condition"> <ul class="cate-list"> <li ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,轉載請保留出處。 簡介 要說Java中什麼異常最容易出現,我想NullPointerException一定當仁不讓,為瞭解決這種null值判斷問題,Java8中提供了一個新的工具類Optional,用於提示程式員註意null值,併在特定場 ...
  • ==Servlet01== 官方api文檔:https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html Servlet和Tomcat的關係:一句話,Tomcat支持Servlet Servlet是跟Tomcat關聯在一起的,換而言之, ...
  • 文件 1.File對象 java封裝的一個操作文件及文件夾(目錄)的對象。可以操作磁碟上的任何一個文件和文件夾。 2.創建文件 方式一:根據路徑構建一個File對象new File(path) //方式一 @Test public void create01(){ try { String path ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...