EGL intro 概述

Overview

OpenGL ES (GL) is a 3D-oriented renderer for embedded systems. It is made available through the OpenGL ES Native Platform Graphics Interface (EGL). Depending on its implementation EGL might be more or less tightly integrated into the native window system. Most EGL functions require an EGL display connection, which can be obtained by calling eglGetDisplay and passing in a native display handler or EGL_DEFAULT_DISPLAY. To initialize and query what EGL version is supported on the display connection, call eglInitialize.

Native window systems supporting EGL make a subset of their visuals available for GL rendering. Windows and pixmaps created with these visuals may also be rendered into using the native window system API.

EGL extends a native window or pixmap with additional buffers. These buffers include a color buffer, a depth buffer, and a stencil buffer. Some or all of the buffers listed are included in each EGL frame buffer configuration.

EGL supports rendering into three types of surfaces: windows, pixmaps and pixel buffers (pbuffers). EGL window and pixmap surfaces are associated with corresponding resources of the native window system. EGL pixel buffers are EGL only resources, and might not accept rendering through the native window system.

To render using OpenGL ES into an EGL surface, you must determine the appropriate EGL frame buffer configuration, which supports the rendering features the application requires. eglChooseConfig returns an EGLConfig matching the required attributes, if any. A complete list of EGL frame buffer configurations can be obtained by calling eglGetConfigs. Attributes of a particular EGL frame buffer configuration can be queried by calling eglGetConfigAttrib.

For EGL window and pixmap surfaces, a suitable native window or pixmap with a matching native visual must be created first. For a given EGL frame buffer configuration, the native visual type and ID can be retrieved with a call to eglGetConfigAttrib. For pixel buffers, no underlying native resource is required.

To create an EGL window surface from a native window, call eglCreateWindowSurface. Likewise, to create an EGL pixmap surface, call eglCreatePixmapSurface. Pixel buffers are created by calling eglCreatePbufferSurface Use eglDestroySurface to release previously allocated resources.

An EGL rendering context is required to bind OpenGL ES rendering to an EGL surface. An EGL surface and an EGL rendering context must have compatible EGL frame buffer configurations. To create an EGL rendering context, call eglCreateContext An EGL rendering context may be bound to one or two EGL surfaces by calling eglMakeCurrent. This context/surfaces association becomes the current context and current surfaces, and is used by all GL rendering commands until eglMakeCurrent is called with different arguments.

Both native and GL commands may be used to operate on certain surfaces, however, the two command streams are not synchronized. Synchronization can be explicitly specified using by calling eglWaitGL, eglWaitNative, and possibly by calling other native window system commands.

Examples

Below is a minimal example of creating an RGBA-format window that allows rendering with OpenGL ES. The window is cleared to yellow when the program runs. For simplicity, the program does not check for any errors.

#include <stdlib.h>
#include <unistd.h>
#include <GLES/egl.h>
#include <GLES/gl.h>

typedef ... NativeWindowType;
extern NativeWindowType createNativeWindow(void);

static EGLint const attribute_list[] = {
    EGL_RED_SIZE, 1,
    EGL_GREEN_SIZE, 1,
    EGL_BLUE_SIZE, 1,
    EGL_NONE
};

int main(int argc, char ** argv)
{
    EGLDisplay display;
    EGLConfig config;
    EGLContext context;
    EGLSurface surface;
    NativeWindowType native_window;
    EGLint num_config;

    /* get an EGL display connection */
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    /* initialize the EGL display connection */
    eglInitialize(display, NULL, NULL);

    /* get an appropriate EGL frame buffer configuration */
    eglChooseConfig(display, attribute_list, &config, 1, &num_config);

    /* create an EGL rendering context */
    context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);

    /* create a native window */
    native_window = createNativeWindow();

    /* create an EGL window surface */
    surface = eglCreateWindowSurface(display, config, native_window, NULL);

    /* connect the context to the surface */
    eglMakeCurrent(display, surface, surface, context);

    /* clear the color buffer */
    glClearColor(1.0, 1.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();

    eglSwapBuffers(display, surface);

    sleep(10);

    return EXIT_SUCCESS;
}

Using EGL Extensions

All supported EGL extensions will have a corresponding definition in egl.h and a token in the extensions string returned by eglQueryString. For extensions in OpenGL ES, refer to glIntro.

Future EGL Versions

eglInitialize and eglQueryString can be used to determine at run-time what version of EGL is available. To check the EGL version at compile-time, test whether EGL_VERSION_x_y is defined, where x and y are the major and minor version numbers.

Reference
  1. EGL intro
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值