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.mzph.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;把模型训练想象成赛车游戏&…