OpenGL-ES 學習(11) ---- EGL

目錄

      • EGL 介紹
      • EGL 類型和初始化
        • EGL初始化方法
          • 獲取 eglDisplay
          • 初始化 EGL
          • 選擇 Config
          • 構造 Surface
          • 構造 Context
          • 開始繪制
      • EGL Demo

EGL 介紹

OpenGL-ES 是一個操作GPU的圖像API標準,它通過驅動向 GPU 發送相關圖形指令,控制圖形渲染管線狀態機的運行狀態,但OpenGL需要本地視窗系統進行交互,這就需要一個中間控制層,最好與平臺無關

EGL ---- 因此被獨立的設計出來,它作為 OpenGL-ES和本地窗口的橋梁

EGLOpenGL ES和底層 Native 平臺視窗系統之間的接口層,EGL API 是獨立于OpenGL ES各版本標準的獨立 APIEGL 提供下面的機制:

  • 和設備的原生窗口系統進行通信
  • 查詢繪圖表面的可用類型和配置
  • 創建繪圖表面
  • OpenGL-ES 和其他渲染API之間同步渲染
  • 管理紋理貼圖等繪圖資源

比如 egl 可以和 opencl 進行同步,主要通過下面幾種方式:

  • 通過 eglCreateContext 創建共享的上下文
  • 通過 eglCreateImageKHR 創建可以被 OpenGL ESOpenCL0 共同訪問的圖像資源
  • eglCreateSyncKHR/eglDestroySyncKHR 等函數可以創建跨 API 的同步點

總結:對接窗口系統,保存繪圖狀態,管理繪圖資源,提供繪圖表面配置,和其他 API 進行同步

OpenGL-ES指令創建 Context 、繪制目標Surface 、配置Framebuffer屬性、Swap提交繪制結果等都是EGL實現的功能

EGL 的作用如下圖所示:
EGL.png

EGL 類型和初始化

EGL 包含了自己的一組數據類型,同時也提供了對一組平臺相關的本地數據類型的支持,這些 Native 數據類型定義在 EGL 系統的頭文件中
下面表格中列舉了常見的幾種 EGL類型:

數據類型說明
EGLBooleanEGL_TRUE =1,EGL_FALSE=0
EGLintwindows上是int32類型
EGLDisplayHandle 概念 typedef void *EGLDisplay;
EGLConfigHandle 概念 typedef void *EGLConfig;
EGLSurfaceHandle 概念 typedef void *EGLSurface
EGLContextHandle 概念 typedef void *EGLContext; OpenGL-ES 圖形上下文,它代表了OpenGL狀態機)
EGL初始化方法

EGL 初始化流程如下圖所示:
EGL 初始化流程.png

獲取 eglDisplay

獲得 Display 要調用 EGLboolean eglGetDisplay(NativeDisplay dpy) 參數一般為 EGL_DEFAULT_DISPLAY

初始化 EGL

調用 EGLboolean eglInitialize**(EGLDisplay dpy, EGLint *major, EGLint *minor),該函數會進行一些內部初始化工作,并傳回 EGL版本號(major,minor)

選擇 Config

一般用EGLboolean eglChooseConfig**(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config)

其中 attr_list 是以 EGL_NONE 結束的參數數組,通常以idvalue依次存放,對于個別標識性的屬性可以只有 id,沒有value

另一個辦法是用 EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config) 來獲得所有config,這兩個函數都會返回不多于 config_sizeconfig ,結果保存在 config[]中,系統的總 Config 個數保存 在num_config

可以利用 eglGetConfig() 中間兩個參數為0來查詢系統支持的 Config總個數,Config有眾多的Attribute,這些Attribute決定FrameBuffer的格式和能力,通過 eglGetConfigAttrib來讀取,但不能修改

構造 Surface

通過 EGLSurface eglCreateWindowSurface**(EGLDisplay dpy, EGLConfig confg, NativeWindow win, EGLint *cfg_attr)
來創建一個可實際顯示的 Surface

系統通常還支持另外兩種 SurfacePixmapSurface和PBufferSurface,這兩種都不是可顯示的Surface,PixmapSurface 是保存在系統內存中的位圖,PBuffer 則是保存在顯存中的幀

對于這兩種 SurfaceAndroid 系統中,支持 PBufferSurface
Surface 也有一些 attribute,基本上都可以顧名思義

EGL_HEIGHT   
EGL_WIDTH   
EGL_LARGEST_PBUFFER   
EGL_TEXTURE_FORMAT   
EGL_TEXTURE_TARGET  
EGL_MIPMAP_TEXTURE   
EGL_MIPMAP_LEVEL

通過 eglSurfaceAttrib 設置、eglQuerySurface讀取

構造 Context

OpenGL ESPipeline 從程序的角度看就是一個狀態機,有當前的顏色、紋理坐標、變換矩陣、絢染模式等一大堆狀態,這些狀態作用于 OpenGL API 程序提交的頂點坐標等圖元從而形成幀緩沖內的像素;在 OpenGL 的編程接口中,Context就代表這個狀態機,OpenGL API程序的主要工作就是向 Context 提供圖元、設置狀態,偶爾也從 Context 里獲取一些信息。
可以用

EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)

EGL變量之間的綁定

boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)
//該接口將申請到的display,draw(surface)和 context進行了綁定。也就是說,在context下的 OpenGLAPI 指令將draw
//(surface)作為其渲染最終目的地。而display作為draw(surface)的前端顯示。調用后,當前線程使用的EGLContex為context
開始繪制

應用程序通過 OpenGL API 進行繪制,一幀完成之后,調用 eglSwapBuffers(EGLDisplay dpy, EGLContext ctx) 來顯示

EGL Demo

#include "esUtil.h"static GLboolean ESUTIL_API esCreateWindow(ESContext *esContext, \const char *title, GLint width, GLint height, GLuint flags) {EGLConfig config;EGLint majorVersion;EGLint minorVersion;EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };if (esContext == NULL) {return GL_FALSE;}esContext->width = width;esContext->height = height;if (!WinCreate(esContext, title)) {return GL_FALSE;}// 獲取 eglDisplayesContext->eglDisplay = eglGetDisplay(esContext->eglNativeDisplay);// Initialize EGLif (!eglInitialize(esContext->eglDisplay, &majorVersion, &minorVersion)) {return GL_FALSE;}#if (TDEBUG == 1)printf("opengl version major:%d minor:%d\n", majorVersion, minorVersion);EGLint numsConfig = 0;eglGetConfigs(esContext->eglDisplay, NULL, 0, &numsConfig);printf("get numsConfig: %d \n", numsConfig);
#endif{EGLint numConfigs = 0;EGLint attribList[] ={EGL_RED_SIZE,       5,EGL_GREEN_SIZE,     6,EGL_BLUE_SIZE,      5,EGL_ALPHA_SIZE,     (flags & ES_WINDOW_ALPHA) ? 8 : EGL_DONT_CARE,EGL_DEPTH_SIZE,     (flags & ES_WINDOW_DEPTH) ? 8 : EGL_DONT_CARE,EGL_STENCIL_SIZE,   (flags & ES_WINDOW_STENCIL) ? 8 : EGL_DONT_CARE,EGL_SAMPLE_BUFFERS, (flags & ES_WINDOW_MULTISAMPLE) ? 1 : 0,// if EGL_KHR_create_context extension is supported, then we will use// EGL_OPENGL_ES3_BIT_KHR instead of EGL_OPENGL_ES2_BIT in the attribute listEGL_RENDERABLE_TYPE, GetContextRenderableType(esContext->eglDisplay),EGL_NONE};// Choose configif (!eglChooseConfig(esContext->eglDisplay, attribList, &config, 1, &numConfigs)) {return GL_FALSE;}}// Create a surfaceesContext->eglSurface = eglCreateWindowSurface(esContext->eglDisplay, config,esContext->eglNativeWindow, NULL);// Create a GL context contextAttribs 指定openGL ES 版本esContext->eglContext = eglCreateContext(esContext->eglDisplay, config,EGL_NO_CONTEXT, contextAttribs);// Make the context currentif (!eglMakeCurrent(esContext->eglDisplay, esContext->eglSurface,esContext->eglSurface, esContext->eglContext)) {return GL_FALSE;}return GL_TRUE;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79193.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

極簡5G專網解決方案

極簡5G專網解決方案 利用便攜式即插即用私有 5G 網絡提升您的智能創新。為您的企業提供無縫、安全且可擴展的 5G 解決方案。 提供極簡5G專網解決方案 Mantiswave Network Private Limited 提供全面的 5G 專用網絡解決方案,以滿足您企業的獨特需求。我們創新的“…

html:table表格

表格代碼示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!-- 標準表格。 --><table border"5"cellspacing&qu…

tkinter 電子時鐘 實現時間日期 可實現透明

以下是一個使用Tkinter模塊創建一個簡單的電子時鐘并顯示時間和日期的示例代碼&#xff1a; import tkinter as tk import time# 創建主窗口 root tk.Tk() root.overrideredirect(True) # 隱藏標題欄 root.attributes(-alpha, 0.7) # 設置透明度# 顯示時間的標簽 time_labe…

【報錯問題】 macOS 的安全策略(Gatekeeper)阻止了未簽名的原生模塊(bcrypt_lib.node)加載

這個錯誤是由于 macOS 的安全策略&#xff08;Gatekeeper&#xff09;阻止了未簽名的原生模塊&#xff08;bcrypt_lib.node&#xff09;加載 導致的。以下是具體解決方案&#xff1a; 1. 臨時允許加載未簽名模塊&#xff08;推薦先嘗試&#xff09; 在終端運行以下命令&#x…

AI實現制作logo的網站添加可選顏色模板

1.效果圖 LogoPalette.jsx import React, {useState} from react import HeadingDescription from ./HeadingDescription import Lookup from /app/_data/Lookup import Colors from /app/_data/Colors function LogoPalette({onHandleInputChange}) { const [selectOptio…

云原生后端架構的挑戰與應對策略

??個人主頁??:慌ZHANG-CSDN博客 ????期待您的關注 ???? 隨著云計算、容器化以及微服務等技術的快速發展,云原生架構已經成為現代軟件開發和運維的主流趨勢。企業通過構建云原生后端系統,能夠實現靈活的資源管理、快速的應用迭代和高效的系統擴展。然而,盡管云原…

【C++】模板為什么要extern?

模板為什么要extern&#xff1f; 在 C 中&#xff0c;多個編譯單元使用同一個模板時&#xff0c;是否可以不使用 extern 取決于模板的實例化方式&#xff08;隱式或顯式&#xff09;&#xff0c;以及你對編譯時間和二進制體積的容忍度。 1. 隱式實例化&#xff1a;可以不用 ex…

中小企業MES系統數據庫設計

版本&#xff1a;V1.0 日期&#xff1a;2025年5月2日 一、數據庫架構概覽 1.1 數據庫選型 數據類型數據庫類型技術選型用途時序數據&#xff08;傳感器讀數&#xff09;時序數據庫TimescaleDB存儲設備實時監控數據結構化業務數據關系型數據庫PostgreSQL工單、質量、設備等核心…

VUE篇之樹形特殊篇

根節點是level:1, level3及其子節點有關聯&#xff0c;但是和level2和他下面的子節點沒有關聯 思路&#xff1a;采用守護風琴效果&#xff0c;遍歷出level1和level2級節點&#xff0c;后面level3的節點&#xff0c;采用樹形結構進行關聯 <template><div :class"…

洛圣電玩系列部署實錄:一次自己從頭跑通的搭建過程

寫這篇文章不是為了“教大家怎么一步步安裝”&#xff0c;而是想把我自己完整跑通洛圣電玩整個平臺的經歷復盤下來。因為哪怕你找到了所謂的全套源碼資源&#xff0c;如果沒人告訴你這些資源之間是怎么連起來的&#xff0c;你依舊是一臉懵逼。 我拿到的是什么版本&#xff1f; …

騰訊云web服務器配置步驟是什么?web服務器有什么用途?

騰訊云web服務器配置步驟是什么?web服務器有什么用途&#xff1f; Web服務器配置步驟&#xff08;以常見環境為例&#xff09; 1. 安裝Web服務器軟件 Linux系統&#xff08;如Ubuntu&#xff09; Apache: sudo apt update sudo apt install apache2 Nginx: sudo apt install…

第37課 繪制原理圖——放置離頁連接符

什么是離頁連接符&#xff1f; 前邊我們介紹了網絡標簽&#xff08;Net Lable&#xff09;&#xff0c;可以讓兩根導線“隔空相連”&#xff0c;使原理圖更加清爽簡潔。 但是網絡標簽的使用也具有一定的局限性&#xff0c;對于兩張不同Sheet上的導線&#xff0c;網絡標簽就不…

Win下的Kafka安裝配置

一、準備工作&#xff08;可以不做&#xff0c;畢竟最新版kafka也不需要zk&#xff09; 1、Windows下安裝Zookeeper &#xff08;1&#xff09;官網下載Zookeeper 官網下載地址 &#xff08;2&#xff09;解壓Zookeeper安裝包到指定目錄C:\DevelopApp\zookeeper\apache-zoo…

前端Vue3 + 后端Spring Boot,前端取消請求后端處理邏輯分析

在 Vue3 Spring Boot 的技術棧下&#xff0c;前端取消請求后&#xff0c;后端是否繼續執行業務邏輯的答案仍然是 取決于請求處理的階段 和 Spring Boot 的實現方式。以下是結合具體技術的詳細分析&#xff1a; 1. 請求未到達 Spring Boot 場景&#xff1a;前端通過 AbortContr…

【藍橋杯省賽真題58】Scratch畫臺扇 藍橋杯scratch圖形化編程 中小學生藍橋杯省賽真題講解

目錄 scratch畫臺扇 一、題目要求 編程實現 二、案例分析 1、角色分析 2、背景分析 3、前期準備 三、解題思路 四、程序編寫 五、考點分析 六、推薦資料 1、scratch資料 2、python資料 3、C++資料 scratch畫臺扇 第十五屆青少年藍橋杯scratch編程省賽真題解析 …

GPT-4o 圖像生成與八個示例指南

什么是GPT-4o圖像生成&#xff1f; 簡單來說&#xff0c;GPT-4o圖像生成是集成在ChatGPT內部的一項功能。用戶可以直接在對話中&#xff0c;通過文本描述&#xff08;Prompt&#xff09;來創建、編輯和調整圖像。這與之前的圖像生成工具相比&#xff0c;體驗更流暢、交互性更強…

TCP 連接的“三次握手”與“四次揮手”

目錄 什么是“三次握手” “四次揮手”&#xff1f; 三個標記位 三次握手 四次揮手 為什么握手三次&#xff0c;揮手需要四次&#xff1f; 為什么要等2MSL&#xff1f; 什么是“三次握手” “四次揮手”&#xff1f; 三次握手&#xff08;Three-way Handshake&#xf…

力扣刷題 -- 206.反轉鏈表

題目&#xff1a; 方法一&#xff1a;創建新鏈表&#xff0c;遍歷舊鏈表&#xff0c;進行頭插 代碼實現&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struc…

Vue 中的過渡效果與響應式數據:transition、transitiongroup、reactive 和 ref 詳解

在 Vue 開發過程中&#xff0c;為應用添加過渡效果和處理響應式數據是提升用戶體驗和實現動態交互的關鍵。 一、transition&#xff1a;元素的單元素過渡效果 transition是 Vue 提供的內置組件&#xff0c;專門用于為單個元素或組件添加過渡動畫。它會在元素插入、更新或移除…

文章七《深度學習調優與超參數優化》

&#x1f680; 文章7&#xff1a;深度學習調優與超參數優化——你的AI模型需要一場"整容手術" 一、模型調優核心策略&#xff1a;像調整游戲裝備一樣優化模型 1. 學習率調整&#xff1a;掌控訓練的"油門踏板" 比喻&#xff1a;把模型訓練想象成賽車游戲&…