OpenGL ES EGL eglCreatePbufferSurface
零基础 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 的配置属性
EGLContext – OpenGL ES 图形上下文
二. EGL 绘制流程简介
- 获取 EGL Display 对象:eglGetDisplay
- 初始化与 EGLDisplay 之间的连接:eglInitialize
- 获取 EGLConfig 对象:eglChooseConfig / eglGetConfigs
- 创建 EGLContext 实例:eglCreateContext
- 创建 EGLSurface 实例:eglCreateWindowSurface / eglCreatePbufferSurface
- 连接 EGLContext 和 EGLSurface:eglMakeCurrent
- 使用 OpenGL ES API 绘制图形:gl_*
- 切换 front buffer 和 back buffer 显示:eglSwapBuffer
- 断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease
- 删除 EGLSurface 对象
- 删除 EGLContext 对象
- 终止与 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
}
五.猜你喜欢
- OpenGL ES 简介
- OpenGL ES 版本介绍
- OpenGL ES 2.0 和 3.0区别
- OpenGL ES 名词解释(一)
- OpenGL ES 名词解释(二)
- OpenGL ES GLSL 着色器使用过程
- OpenGL ES EGL 简介
- OpenGL ES EGL 名词解释
- OpenGL ES EGL eglGetDisplay
- OpenGL ES EGL eglInitialize
- OpenGL ES EGL eglGetConfigs
- OpenGL ES EGL eglChooseConfig
- OpenGL ES EGL eglGetError
- OpenGL ES EGL eglCreateContext
- OpenGL ES EGL eglCreateWindowSurface
- OpenGL ES EGL eglCreatePbufferSurface
相关文章
- es配置x-pack使用账号密码验证
- es日常维护
- es中使用group by分组的实现统计不同bikeId的去重操作
- 第二章 logstash - 输出插件之redis与es
- [TF Lite] TensorFlow Lite with OpenGL ES
- [置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动
- Elasticsearch之中文分词器插件es-ik的自定义词库
- Android下Opengl ES实现单屏幕双眼显示
- 【ES】elasticsearch学习笔记
- 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲(二)
- 一、了解 OpenGL ES
- Elasticsearch教程(31) es mapping参数doc_values enabled ignore_above norms store详解
- Elasticsearch教程(10) ES term terms prefix 搜索 聚合查询 详细总结
- 【笔记】再学JavaScript ES(6-10)全版本语法——反射机制及应用
- 【笔记】再学JavaScript ES(6-10)全版本语法——回调地狱&异步操作(Promise/then/resolve/reject/catch/all/race)
- 人像抠图 + OpenGL ES
- 推荐一款强大的 Android OpenGL ES 调试工具
- OpenGL ES 常见滤镜处理
- Android OpenGL ES(八) - 简单实现绿幕抠图
- OpenGL ES: (3) EGL、EGL绘图的基本步骤、EGLSurface、ANativeWindow
- 基于Cocos2d-x学习OpenGL ES 2.0之多纹理
- ES聚合之Bucket聚合语法讲解
- Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL
- Android OpenGL ES 学习(五) -- 渐变色
- Android OpenGL ES 学习(三) -- 绘制平面图形
- Android OpenGL ES 学习(一) -- 基本概念
- ES系列之嵌套文档和父子文档