首页 > 系统相关 >OpenGL ES EGL eglCreateWindowSurface

OpenGL ES EGL eglCreateWindowSurface

时间:2022-10-30 09:44:27浏览次数:61  
标签:eglCreateWindowSurface OpenGL EGL EGLSurface display 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 学习目录 >> 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 之间的连接

三.eglCreateWindowSurface 函数简介

EGLSurface 也称为 渲染区域,相当于 OpenGL ES 绘图的画布 (一块内存空间),用户想绘制的信息首先都要先绘制到 EGLSurface 上,然后通过 EGLDisplay 显示

1.eglCreateWindowSurface 函数

创建 EGLSurface 需要 EGLConfig,函数声明如下:

/*描述:创建 OpenGL ES EGLSurface
 *参数:
 *    display:指定显示的连接
 *    config:配置 EGLConfig
 *    native_window:原生窗口
 *    attribList:指定操作的属性列表
 *
 *返回值:成功时返回新创建的 EGLSurface,失败时返回EGL_NO_SURFACE.
 */

EGLSurface eglCreateWindowSurface(
	EGLDisplay display,
 	EGLConfig config,
 	NativeWindowType native_window,
 	EGLint const * attrib_list);

如果创建 EGLSurface 失败,可以通过 eglGetError 获取错误类型,可能产生错误号:

EGL_BAD_DISPLAY: 连接不是一个EGL display连接
EGL_NOT_INITIALIZED: EGL没有初始化
EGL_BAD_CONFIG: EGL frame buffer配置无效
EGL_BAD_NATIVE_WINDOW: native window不是与display相同平台的有效Native Window
EGL_BAD_ATTRIBUTE: attrib_list包含无效参数,或者参数未被识别,或者参数越界
EGL_BAD_ALLOC:已经有一个与native window关联的Surface,或者无法为新的EGL窗口分配资源,
EGL_BAD_MATCH:本机窗口的像素格式与配置所需的颜色缓冲区的格式、类型和大小不一致

2.EGLSurface 分类

在文章 《OpenGL ES EGL 名词解释》有详细介绍, EGLSurface 一共分为三类:

1.Surface – 可显示的 Surface,实际上就是一个 FrameBuffer,用于绑定窗口后预览显示,通过 eglCreateWindowSurface 创建;

2.PixmapSurface – 不是可显示的 Surface,保存在系统内存中的位图;

3.PBufferSurface – 不是可显示的 Surface,保存在显存中的帧,用于离屏渲染,不需要绑定窗口通过 eglCreatePbufferSurface 创建

四.eglCreateWindowSurface 函数使用

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES EGL eglCreateWindowSurface
//@Time:2022/08/04 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

EGLBoolean initializeWindow(EGLNativeWindow nativeWindow)
{
    const EGLint configAttribs[] = {EGL_RENDER_TYPE, EGL_WINDOW_BIT,
                                    EGL_RED_SIZE,    8,
                                    EGL_GREEN_SIZE,  8,
                                    EGL_BLUE_SIZE,   8,
                                    EGL_DEPTH_SIZE,  24,
                                    EGL_NONE};

    const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};

    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
    if (display == EGL_NO_DISPLAY)
    {
        return EGL_FALSE;
    }

    EGLint major, minor;
    if (!eglInitialize(display, &major, &minor))
    {
        return EGL_FALSE;
    }

    EGLConfig config;
    EGLint numConfigs;
    if (!eglChooseConfig(display, configAttribs, &config, 1, &numConfigs))
    {
        return EGL_FALSE;
    }

    EGLSurface window = eglCreateWindowSurface(display, config, nativeWindow, NULL);
    if (window == EGL_NO_SURFACE)
    {
        return EGL_FALSE;
    }

    EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
    if (context == EGL_NO_CONTEXT)
    {
        return EGL_FALSE;
    }

    if (!eglMakeCurrent(display, window, window, context))
    {
        return EGL_FALSE;
    }
    return EGL_TRUE;
}

五.猜你喜欢

  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

本文由博客 - 猿说编程 猿说编程 发布!

标签:eglCreateWindowSurface,OpenGL,EGL,EGLSurface,display,ES
From: https://www.cnblogs.com/shuopython/p/16840518.html

相关文章

  • iptables防火墙
    一.iptables概述•Linux系统的防火墙:IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成•主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口等......
  • AtCoder Beginner Contest 275
    咕咕咕咕咕咕。G-InfiniteKnapsack做法1-二分假设第\(i\)个物品选了\(x_i\)个,\(x_i\)为非负整数,有\[\lim_{x\to+\infin}\frac{f(x)}{x}=\frac{\sum_ic_......
  • 大数据Hadoop之——Apache Hudi 与 Presto/Trino集成
    目录一、概述二、Trino环境部署1)安装JDK2)安装python3)安装Trino1、下载解压并配置环境变量2、修改配置3、启动服务4、测试验证三、在Hive中创建表关联Hudi表1)添加jar包2)创......
  • Codeforces Round #831 (Div. 1 + Div. 2) E
    E.HangingHearts我们观察每一个节点它可以由其子节点的所有长链来构造还有就是直接可以由自己构成的一条长链所以对于每一个节点我们的答案就是max(加上自己的最长链......
  • AtCoder Regular Contest 060
    F题有循环节,一看就有KMP,比较难,太晚了,早上起来再补。C-TakandCards\(n\)个整数\(a_1\sima_n\),问有多少种选数方案,使得选出来的数平均值为\(A\)。\(1\len,a_i......
  • TypeScript第一天学习记录
    2022年10月29日19点17分1.TypeScript是什么1.1TypeScript是什么?TypeScript(简称:TS)是JavaScript的超集(JS有的TS都有)TypeScript=Type+Javascript(在JS基础之上,为J......
  • 二进制安装Kubernetes v1.25.0
    前言:因为ecs资源丰富,这回敞开用当回地主,一共使用了8台机器,分别是三台master节点,三台工作节点和两台负载均衡。1.部署规划表hostnameIPSoftwareVersion......
  • 前后端分离项目(八):后端报错Field 'id' doesn't have a default value
    好家伙,又到了修bug的环节,(深叹一口气) 好了,来看报错2022-10-2923:27:52.155WARN15068---[nio-8011-exec-2]o.h.engine.jdbc.spi.SqlExceptionHelper:SQ......
  • 实验7:基于REST API的SDN北向应用实践
    一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境Ubuntu20.04Desktopamd64三、......
  • 实验7:基于REST API的SDN北向应用实践
    一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境下载虚拟机软件OracleVisualBo......