当前位置: 首页 > 工具软件 > Android-GL > 使用案例 >

Android EGL入门

和和裕
2023-12-01

EGL

指定显示连接,默认连接为EGL_DEFAULT_DISPLAY

 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

打开连接之后,需要初始化EGL
major 指定EGL实现返回的主版本号,可能为NULL
minor 指定EGL实现返回的次版本号,可能为NULL

 EGLint major, minor;
    if (!eglInitialize(display, &major, &minor)){
        return EGL_FALSE;
    }

初始化了EGL之后,就可以确定可用渲染表面的类型和配置
使用方法:

eglGetConfigs(EGLDisplay display, EGLConfig *configs,EGLint maxReturnCOnfigs,EGLint *numConfigs)

查询EGLConfig属性

eglGetConfigAttrib(EGLDisplay display, EGLConfig config, EGLint attribute, EGLint *value)

EGL选择配置:
configAttribs 指定configs匹配的属性列表
config 指定匹配列表
指定配置的大小
numConfigs 指定返回的配置大小

const EGLint configAttribs[] = {
            EGL_RENDERABLE_TYPE, EGL_WINDOW_BIT,
            EGL_RED_SIZE, 8,
            EGL_GREEN_SIZE, 8,
            EGL_BLUE_SIZE, 8,
            EGL_DEPTH_SIZE, 24,
            EGL_NONE
    };

 EGLConfig  config;
 EGLint numConfigs;
    if (!eglChooseConfig(display, configAttribs, &config, 1, &numConfigs)){
        return EGL_FALSE;
    }

创建屏幕上的渲染区域:EGL窗口
config 指定配置
window 指定原生窗口
attribList 指定窗口列表,可能为NULL

 EGLSurface window = eglCreateWindowSurface(display, config, nativeWindow, attribList );
    if (window == EGL_NO_SURFACE){
        return EGL_FALSE;
    }

创建一个渲染上下文
config 指定配置
contextAttribs 指定创建山西该文使用的属性列表;只有一个可接受的属性–EGL_CONTEXT_CLIENT_VERSION

   const EGLint contextAttribs[] = {
            EGL_CONTEXT_CLIENT_VERSION, 3,
            EGL_NONE
    };
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
    if (context == EGL_NO_CONTEXT){
        return EGL_FALSE;
    }

EGL_NO_CONTEXT:没有共享,不允许多个EGL上下文共享特定类型的数据

指定某个EGLContext为当前上下文

 if (!eglMakeCurrent(display, window, window, context)){
        return EGL_FALSE;
    }

简单整合

#include "EGL/egl.h"

static EGLBoolean initWindow(ANativeWindow* nativeWindow){
    const EGLint configAttribs[] = {
            EGL_RENDERABLE_TYPE, EGL_WINDOW_BIT,
            EGL_RED_SIZE, 8,
            EGL_GREEN_SIZE, 8,
            EGL_BLUE_SIZE, 8,
            EGL_DEPTH_SIZE, 24,
            EGL_NONE
    };
    const EGLint contextAttribs[] = {
            EGL_CONTEXT_CLIENT_VERSION, 3,
            EGL_NONE
    };
    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if (display == EGL_NO_DISPLAY){
        return EGL_FALSE;
    }
    EGLint major, minor;
    if (!eglInitialize(display, &major, &minor)){
        return EGL_FALSE;
    }
    EGLConfig  config;
    EGLint numConfigs;
    if (!eglChooseConfig(display, configAttribs, &config, 1, &numConfigs)){
        return EGL_FALSE;
    }
    EGLSurface window = eglCreateWindowSurface(display, config, nativeWindow, NULL);
    if (window == EGL_NO_SURFACE){
        return EGL_FALSE;
    }
    EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
    if (context == EGL_NO_CONTEXT){
        return EGL_FALSE;
    }
    if (!eglMakeCurrent(display, window, window, context)){
        return EGL_FALSE;
    }
    return EGL_TRUE;
}


参考于《OpenGL es3.0编程指南》

 类似资料: