OpenGL ES EGL eglCreateWindowSurface

打印 上一主题 下一主题

主题 517|帖子 517|积分 1551

零基础 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 绘制流程简介


三.eglCreateWindowSurface 函数简介

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

创建 EGLSurface 需要 EGLConfig,函数声明如下:
  1. /*描述:创建 OpenGL ES EGLSurface
  2. *参数:
  3. *    display:指定显示的连接
  4. *    config:配置 EGLConfig
  5. *    native_window:原生窗口
  6. *    attribList:指定操作的属性列表
  7. *
  8. *返回值:成功时返回新创建的 EGLSurface,失败时返回EGL_NO_SURFACE.
  9. */
  10. EGLSurface eglCreateWindowSurface(
  11.         EGLDisplay display,
  12.         EGLConfig config,
  13.         NativeWindowType native_window,
  14.         EGLint const * attrib_list);
复制代码
如果创建 EGLSurface 失败,可以通过 eglGetError 获取错误类型,可能产生错误号:
  1. EGL_BAD_DISPLAY: 连接不是一个EGL display连接
  2. EGL_NOT_INITIALIZED: EGL没有初始化
  3. EGL_BAD_CONFIG: EGL frame buffer配置无效
  4. EGL_BAD_NATIVE_WINDOW: native window不是与display相同平台的有效Native Window
  5. EGL_BAD_ATTRIBUTE: attrib_list包含无效参数,或者参数未被识别,或者参数越界
  6. EGL_BAD_ALLOC:已经有一个与native window关联的Surface,或者无法为新的EGL窗口分配资源,
  7. EGL_BAD_MATCH:本机窗口的像素格式与配置所需的颜色缓冲区的格式、类型和大小不一致
复制代码
2.EGLSurface 分类

在文章 《OpenGL ES EGL 名词解释》有详细介绍, EGLSurface 一共分为三类:
1.Surface – 可显示的 Surface,实际上就是一个 FrameBuffer,用于绑定窗口后预览显示,通过 eglCreateWindowSurface 创建;
2.PixmapSurface – 不是可显示的 Surface,保存在系统内存中的位图;
3.PBufferSurface – 不是可显示的 Surface,保存在显存中的帧,用于离屏渲染,不需要绑定窗口通过 eglCreatePbufferSurface 创建
四.eglCreateWindowSurface 函数使用
  1. /******************************************************************************************/
  2. //@Author:猿说编程
  3. //@Blog(个人博客地址): www.codersrc.com
  4. //@File:OpenGL ES EGL eglCreateWindowSurface
  5. //@Time:2022/08/04 07:30
  6. //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  7. /******************************************************************************************/
  8. EGLBoolean initializeWindow(EGLNativeWindow nativeWindow)
  9. {
  10.     const EGLint configAttribs[] = {EGL_RENDER_TYPE, EGL_WINDOW_BIT,
  11.                                     EGL_RED_SIZE,    8,
  12.                                     EGL_GREEN_SIZE,  8,
  13.                                     EGL_BLUE_SIZE,   8,
  14.                                     EGL_DEPTH_SIZE,  24,
  15.                                     EGL_NONE};
  16.     const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
  17.     EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
  18.     if (display == EGL_NO_DISPLAY)
  19.     {
  20.         return EGL_FALSE;
  21.     }
  22.     EGLint major, minor;
  23.     if (!eglInitialize(display, &major, &minor))
  24.     {
  25.         return EGL_FALSE;
  26.     }
  27.     EGLConfig config;
  28.     EGLint numConfigs;
  29.     if (!eglChooseConfig(display, configAttribs, &config, 1, &numConfigs))
  30.     {
  31.         return EGL_FALSE;
  32.     }
  33.     EGLSurface window = eglCreateWindowSurface(display, config, nativeWindow, NULL);
  34.     if (window == EGL_NO_SURFACE)
  35.     {
  36.         return EGL_FALSE;
  37.     }
  38.     EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
  39.     if (context == EGL_NO_CONTEXT)
  40.     {
  41.         return EGL_FALSE;
  42.     }
  43.     if (!eglMakeCurrent(display, window, window, context))
  44.     {
  45.         return EGL_FALSE;
  46.     }
  47.     return EGL_TRUE;
  48. }
复制代码
五.猜你喜欢

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表