OpenGL ES EGL 名词解释

目录

零基础 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 编程

一.前言

OpenGL ES 定义了一个渲染图形的 API。它没有定义窗口系统。为了使 OpenGL ES 可以工作于各种平台之上,我们可以通过 google angle 完成;

ANGLE 的目标是通过将 OpenGL ES API 调用转换为该平台可用的硬件支持的 API 之一,。就是把 OpenGL ES 翻译成其他的语言,譬如说 D3D9 / OpenGL ES / Vulkan / Metal 等等。

ANGLE 支持 Windows / Mac / Linux / Android / Ios ;

ANGLE 目前提供从 OpenGL ES 2.0、3.0 和 3.1 到 Vulkan、桌面 OpenGL、OpenGL ES、Direct3D 9 和 Direct3D 11 的转换;

详细参考:OpenGL ES EGL 简介

二.EGLNativeDisplayType

EGLNativeDisplayType 在 OpenGL ES 与本地窗口系统之间架起了一座沟通的桥梁,EGLNativeDisplayType 一般使用默认的 EGL_DEFAULT_DISPLAY,在不同平台其实现是不同的,EGL 只提供抽象标准,在 Windwos 中 该值默认为 DX ,如果想使用 OPenGL,可以通过如下设置配置

EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,
                EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,EGL_NONE };

三.EGLNativeWindowType

EGLNativeWindowType 表示窗口句柄,在不同平台其实现是不同的,EGL 只提供抽象标准,在 Windows 中 EGLNativeWindowType 实际上就是窗口句柄 HWND ,头文件声明如下:

#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) /* Windows Desktop */

typedef HWND    EGLNativeWindowType;
#else
/* Windows Store */
#include <inspectable.h>
typedef IInspectable* EGLNativeWindowType;

#endif

如果是想在窗口实时查看渲染结果,我们可以通过 eglCreateWindowSurface 创建可显示的 EGLSurface ,绑定窗口 HWND 后预览显示;

如果是离屏幕渲染,不需要绑定窗口,那么就不需要该参数,可以直接使用 eglCreatePbufferSurface 创建不可显示的 EGLSurface,保存在显存中的帧;

四.EGLDisplay

**EGLDisplay 是一个关联系统物理屏幕的通用数据类型。**对于 PC 来说, EGLDisplay 就是显示器的句柄。不管是嵌入式系统或 PC ,都可能有多个物理显示设备。为了使用系统的显示设备, EGL 提供了 EGLDisplay 数据类型,以及一组操作设备显示的 API 。

在不同平台上有不同的机制以关联窗口系统,在 Windows 上是 WGL ,在 Linux 上是 GLX ,在 Apple OS 上是 AGL 等。

**EGL 则是平台上 WGL / GLX / AGL 的等价物。**eglGetDisplay 为原生窗口系统 displayId 获取一个 EGL display 连接,在 OpenGL ES 与本地窗口系统之间架起了一座沟通的桥梁

EGLDisplay eglGetDisplay(EGLNativeDisplayType displayId);

1.默认原生窗口渲染

EGLNativeDisplayType 默认为 EGL_DEFAULT_DISPLAY ,即返回与默认原生窗口的连接,在 Windows 中默认为 DX 渲染

eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

2.强制启用 OPenGL 渲染

EGLAttrib dispattrs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE,
            EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,EGL_NONE };

eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
            EGL_DEFAULT_DISPLAY, dispattrs);

五.EGLConfig

EGLConfig 是对 EGLSurface 的 EGL 配置,可以理解为绘制目标 framebuffer 的配置属性

六.EGLSurface

EGLSurface 也被称为渲染区域,系统窗口或 frame buffer 句柄 ,可以理解为一个后端的渲染目标窗口 ;

** EGLSurface 相当于一块画布(一块内存空间),用户想绘制的信息首先都要先绘制到 EGLSurface 上**

EGLSurface 分为以下三类:

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

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

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

1.创建屏幕上的渲染区域 – EGL 窗口,实时预览

eglCreateWindowSurface 成功时返回新创建的 EGLSurface ,失败时返回 EGL_NO_SURFACE.

EGLSurface eglCreateWindowSurface(
	EGLDisplay display,	        //对应的EGL display连接
 	EGLConfig config,	        //EGL frame buffer配置
 	NativeWindowType native_window,	//原生窗口
 	EGLint const * attrib_list);	// Window Surface属性列表,可以为NULL

2.创建屏幕外的渲染区域 – 离屏渲染

创建一个离屏 pixel buffer surface 返回它的句柄

EGLSurface eglCreatePbufferSurface(
	EGLDisplay display, 		// 指定EGL显示连接
        EGLConfig config, 		// 指定配置
        const EGLint *attribList)       // 指定像素缓冲区属性

相关错误码:

EGL_BAD_MATCH :提供了与窗口属性不匹配的 EGLConfig,或该 EGLConfig 不支持渲染到窗口
EGL_BAD_CONFIG :提供的 EGLConfig 没有得到系统支持
EGL_BAD_NATIVE_WINDOW :提供的原生窗口句柄无效
EGL_BAD_ALLOC :无法为新的窗口分配资源,或已经有和提供的原生窗口关联的 EGLConfig

七.EGL Pbuffer 创建屏幕外渲染区域

除了可以用 OpenGL ES 3.0 在屏幕上的窗口渲染之外,还可以渲染称作 Pbuffer (像素缓冲区 Pixel buffer 简写)的不可见的屏幕外表面,不需要绑定窗口,用于离屏渲染。

和窗口一样,pbuffer 可以利用 OpenGL ES 3.0 中的任何硬件加速。Pbuffer 最常用于生成纹理贴图。如果你想要做的是渲染到一个纹理,那么我们建议使用帧缓冲区代替 Pbuffer,因为 帧缓冲区更高效。

创建 Pbuffer 和创建 EGL 窗口非常类似,只有少数微小的不同。为了创建 Pbuffer ,需要和窗口一样找到 EGLConfig ,并作一处修改:我们需要扩增 EGL_SURFACE_TYPE 的值,使其包含 EGL_PBUFFER_BIT。

EGLSurface eglCreatePbufferSurface(
            EGLDisplay display, // 指定EGL显示连接
            EGLConfig config, // 符合条件的 EGLConfig
            const EGLint *attribList); // 指定像素缓冲区属性列表,可为 NULL

创建一个 EGL 像素缓冲区:

	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
	}

八.EGLContext

1.创建上下文

OpenGL ES 图形上下文,它代表了 OpenGL 状态机;如果没有它,OpenGL 指令就没有执行的环境。

EGLAPI EGLContext EGLAPIENTRY eglCreateContext(
		EGLDisplay display,
                EGLConfig config,
                EGLContext share_context,
                const EGLint *attribList);

EGLContext 上下文包含了操作所需的所有状态信息,OpenGL ES 必须有一个可用的上下文才能进行绘图。

2.使用上下文

EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(
		EGLDisplay display,
                EGLSurface draw,
              	EGLSurface read, EGLContext context);

3.获取上下文信息

eglQueryContext 用于获取 Context 信息

EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(
                 EGLDisplay display,
                 EGLContext context,
                 EGLint attribute,
                 EGLint *value);

成功时返回 EGL_TRUE,失败时返回 EGL_FALSE,可能的错误为:

EGL_BAD_DISPLAY
EGL_NOT_INITIALIZED
EGL_BAD_CONTEXT
EGL_BAD_ATTRIBUTE

attribute 取值可以是:

EGL_CONFIG_ID
EGL_CONTEXT_CLIENT_TYPE
EGL_CONTEXT_CLIENT_VERSION
EGL_RENDER_BUFFER

4.销毁渲染上下文

EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay display, EGLContext context);

九.猜你喜欢

  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 名词解释
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿说编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值