EGL 环境创建

OpenGL ES 是Android绘图API,但OpenGL ES是平台通用的,在特定设备上使用需要一个中间层做适配,这个中间层就是EGL。

EGL架构

在这里插入图片描述

  • EGLDisplay 是对实际显示设备的抽象。
  • EGLSurface 是对用来存储图像的内存区域 FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer。
  • EGLContext 存储 OpenGL ES绘图的一些状态信息。

创建流程

在这里插入图片描述
第一步通常就获取默认的显示设备 EGL_DEFAULT_DISPLAY。
比较复杂的是选择合适的配置项,平台会提供多种预置模式供选择。

  • 要先通过 eglGetConfig 获取平台所支持的 config 列表,
  • 然后逐个调用 eglGetConfigAttrib 获取详细的属性配置,筛选到自己需要的配置,
  • 最后调用eglChooseConfig 选定配置项。

然后就按顺序创建 context 和 surface 就好了,最后切换到当前环境。至此EGL环境就创建成功了,然后就可以进行opengl操作。

注意

因为在创建 eglSurface 的时候,一般会选择BACK_BUFFER,也就是双缓冲机制,所以,在每帧绘制完成以后,一般还需要 eglSwapBuffers 才能上屏显示。

另外还有一种离屏显示的,用 eglCreatePbufferSurface 创建,在多线程渲染的应用中会用到。因为 NativeWindow 只能链接一个 surface,所以除了最终上屏的那个线程以外,其他线程应绑定 PbufferSurface 。
在Android平台上,有时候还需要设置一下native window属性,否则可能会出现横竖方向错误问题。调用接口如下:

/*
 * Change the format and size of the window buffers.
 *
 * The width and height control the number of pixels in the buffers, not the
 * dimensions of the window on screen.  If these are different than the
 * window's physical size, then it buffer will be scaled to match that size
 * when compositing it to the screen.
 *
 * For all of these parameters, if 0 is supplied then the window's base
 * value will come back in force.
 *
 * width and height must be either both zero or both non-zero.
 *
 */
int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window,
        int32_t width, int32_t height, int32_t format);

下面是一段比较完整的创建代码:

bool initialize(ANativeWindow *_window) {
   
   

    EGLConfig config;
    EGLint maxConfig;
    EGLint format;
    EGLint width;
    EGLint height;
    EGLint major;
    EGLint minor;
    EGLBoolean result;

    m_display = eglGetDispl
创建一个OpenGL环境,你可以使用EGL(Embedded System Graphics Library)来实现。EGL是一个跨平台的图形库,用于管理图形显示和渲染的接口。 下面是使用EGL创建OpenGL环境的一般步骤: 1. 初始化EGL库:首先,你需要初始化EGL库。这可以通过调用`eglGetDisplay`函数来完成,该函数返回一个指向EGL显示的句柄。 2. 选择配置:在创建OpenGL环境之前,你需要选择一个合适的配置。配置定义了OpenGL的特性和渲染属性。你可以使用`eglChooseConfig`函数来选择一个合适的配置。 3. 创建上下文:一旦选择了配置,你可以使用`eglCreateContext`函数创建一个OpenGL上下文。上下文包含了所有OpenGL状态和对象。 4. 绑定上下文:在进行任何OpenGL操作之前,你需要将上下文绑定到当前线程。这可以通过调用`eglMakeCurrent`函数来完成。 5. 渲染:现在,你已经准备好在OpenGL环境中进行渲染了。你可以使用OpenGL的API函数来绘制图形、加载纹理等。 6. 交换缓冲区:当你完成渲染时,调用`eglSwapBuffers`函数将渲染的结果显示在屏幕上。 7. 清理资源:当你不再需要OpenGL环境时,记得释放所有资源。可以使用`eglDestroyContext`函数来销毁上下文。 这只是一个简单的示例,实际上在创建和使用OpenGL环境时可能涉及到更多的细节和设置。你可以参考EGL和OpenGL的文档来了解更多详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值