零基础 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 – 渲染区域,系统窗口或 frame buffer 句柄 ,可以理解为一个后端的渲染目标窗口
EGLConfig – 对 EGLSurface的 EGL 配置,可以理解为绘制目标 framebuffer 的配置属性
EGLContext – OpenGL ES 图形上下文
二. EGL 绘制流程简介
- 获取 EGL Display 对象:eglGetDisplay
- 初始化与 EGLDisplay 之间的连接:eglInitialize
- 获取 EGLConfig 对象:eglChooseConfig
- 创建 EGLContext 实例:eglCreateContext
- 创建 EGLSurface 实例:eglCreateWindowSurface
- 连接 EGLContext 和 EGLSurface:eglMakeCurrent
- 使用 OpenGL ES API 绘制图形:gl_*
- 切换 front buffer 和 back buffer 显示:eglSwapBuffer
- 断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease
- 删除 EGLSurface 对象
- 删除 EGLContext 对象
- 终止与 EGLDisplay 之间的连接
三. eglGetDisplay
在不同平台上有不同的机制以关联窗口系统,在 Windows 上是 WGL ,在 Linux 上是 GLX ,在 Apple OS 上是 AGL 等。
EGL 则是平台上 WGL / GLX / AGL 的等价物。eglGetDisplay 为原生窗口系统 displayId 获取一个EGL display连接,在 OpenGL ES 与本地窗口系统之间架起了一座沟通的桥梁,函数声明如下:
/* 描述:获取 EGLDisplay 对象 显示设备
* 参数:
* displayId:系统显示类型
*
* 返回值:成功返回 EGLDisplay 对象,失败返回 EGL_NO_DISPLAY
*/
EGLDisplay eglGetDisplay(EGLNativeDisplayType displayId);
1.使用系统默认显示类型
EGLNativeDisplayType 默认为 EGL_DEFAULT_DISPLAY ,即返回与默认原生窗口的连接,在 Windows 中默认为 DX 渲染
EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); //两种写法任选其一,效果等价
EGLDisplay eglDisplay = eglGetDisplay(0); //两种写法任选其一,效果等价
2.强制启用 OpenGL 渲染
OpenGL 选择 EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE
//OpenGL 选择 EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE
EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,
EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,EGL_NONE };
EGLDisplay eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
EGL_DEFAULT_DISPLAY, dispattrs);
3.强制启用 DX 渲染
DX 选择 EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 或者 EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE
//DX 选择 EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 或者 EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE
EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,
EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,EGL_NONE };
EGLDisplay eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
EGL_DEFAULT_DISPLAY, dispattrs);
4.检查返回值
EGLDisplay eglDisplay = eglGetDisplay(EGLNativeDisplayType displayId);
if (eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS))
return error;
else
return success;
四.猜你喜欢
- 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
ChatGPT 3.5 国内中文镜像站免费使用啦
暂无评论内容