OpenGL ES:Android平台EGL环境

前言

这篇文章简单介绍一下在Android平台下的EGL环境的相关内容,由于OpenGL ES并不负责窗口管理以及上下文管理,该职责由各个平台自行完成;在Android平台下OpenGL ES的上下文环境是依赖EGL的API进行搭建的。

对于EGL这个框架,谷歌已经提供了GLSurfaceView,是一个已经封装EGL相关处理的工具类,但是不够灵活;对于更加核心的OpengGL ES的用法(例如多线程共享纹理)则需要开发者自行搭建EGL开发环境。

按照惯例先上一份源码 AndroidVideo
Java相关核心实现在 EglBase14.javaEglBase10.java
Native相关实现,可以参考 egl_base.cpp


前置知识

Java层实现
在Java层,EGL封装了两套框架,分别是:

  • 位于javax.microedition.khronos.egl包下的EGL10
  • 位于android.opengl包下的EGL14

其主要区别是:

  • EGL14是在Android 4.2(API 17)引入的,换言之API 17以下的版本不支持EGL14
  • EGL10不支持OpenGL ES 2.x,因此在EGL10中某些相关常量参数只能用手写硬编码代替,例如EGL14.EGL_CONTEXT_CLIENT_VERSION以及EGL14.EGL_OPENGL_ES2_BIT等等。

PS:由于主体流程基本一致,所以本篇以EGL14的代码进行示例。

Native层实现
程序在Native层使用EGL环境时。
需要引入EGL的so库:

Android.mk

LOCAL_LDLIBS += -lEGL

CMake:

find_library( EGL-lib
        EGL )

需要包含头文件:

#include <EGL/egl.h>
#include <EGL/eglext.h>

EGL环境配置整体流程

  1. 获取默认的EGLDisplay
  2. EGLDisplay进行初始化。
  3. 输入预设置的参数获取EGL支持的EGLConfig
  4. 通过EGLDisplayEGLConfig创建一个EGLContext上下文环境。
  5. 创建一个EGLSurface来连接EGL和设备的屏幕。
  6. 在渲染线程绑定EGLSurfaceEGLContext
  7. 【进行OpenGL ES的API渲染步骤】(与EGL无关)
  8. 调用SwapBuffer进行双缓冲切换显示渲染画面。
  9. 释放EGL相关资源EGLSurfaceEGLContextEGLDisplay

获取显示设备

首先,EGL是需要知道绘制内容的目标在哪里,EGLDisplay是一个封装了物理屏幕的数据类型,也可以理解为绘制目标的一个抽象。

通常通过eglGetDisplay()方法返回EGLDisplay来作为OpenGL ES的渲染目标,在该方法中,一般来说都会将常量EGL_DEFAULT_DISPLAY传进方法中,而各个手机厂商则会返回默认的显示设备。

java代码:

EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
//需判断是否成功获取EGLDisplay
if (eglDisplay == EGL14.EGL_NO_DISPLAY) {
   
	throw new RuntimeException("Unable to get EGL14 display");
}

c代码:

EGLDisplay egl_display;
egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
//需判断是否成功获取EGLDisplay
if (egl_display == EGL_NO_DISPLAY)
	return error;

一般来说,我们需要验证eglGetDisplay()的返回值,如果是EGL_NO_DISPLAY的话,那么就是没有获取默认显示设备,需要返回给客户端上层处理异常。

当我们获取到了EGLDisplay,我们需要调用eglInitialize()对其进行初始化,该方法会返回一个bool变量代表执行是否成功。

java代码:

int version[] = new int[2];
if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值