opengl es 的EGL使用

1. EGL的初始化

bool InitEgl(void)
{
    EGLint majorVersion = 0; 
    EGLint minorVersion = 0; 
    
    //打开一个EGL显示服务器连接
    EGLDisplay display;    
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);      
    if (display == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS)       
        return FALSE; 
    
    //初始化EGL内部数据, 返回EGL主次版本号    
    if (!eglInitialize(display, &majorVersion, &minorVersion) ||        
        eglGetError() != EGL_SUCCESS)     
    {        
        return FALSE;    
    } 
}

2. EGL Configurations

查询窗口配置信息使用: EGLBoolean eglGetConfigs(EGLDisplay, EGLConfig *configs, EGLint maxReturnConfigs, EGLint *numConfigs);

eglGetConfigs有两种调用方式: ①如果参数#2为NULL, 系统将返回EGL_TURE, 并设定查找到的EGLConfigs可用数目numConfigs.

②参数#2不为空, 返回EGLConfig列表.

查询单个属性的使用: EGLBoolean eglGetConfigsAttrib(EGLDisplay, EGLConfig config, EGLint attribute, EGLint *value);


//获得EGL configurations are supported
bool GetEglConfigs( EGLDisplay &display)
{
    EGLConfig *config_list = 0;
    EGLint num_configs = 0;

    //find out how many configurations are supported
    if (eglGetConfigs(display, NULL, 0, &num_configs) == EGL_FALSE ||
        eglGetError() != EGL_SUCCESS)
    {
        return FALSE;
    }

    config_list = (EGLConfig *)malloc(num_configs * sizeof(EGLConfig));
    if (config_list == (EGLConfig *)0)
        return FALSE;

    //get configurations
    if (eglGetConfigs(display, config_list, num_configs, &num_configs) == EGL_FALSE ||
        eglGetError() != EGL_SUCCESS)
    {
        free(config_list);
        return FALSE;
    }

    for (int i =0; i < num_configs; ++i)
        std::cout<<*(config_list + i)<<std::endl;

    return TRUE;
}

3. 使用eglChooseConfig去找出最匹配要求的窗口

对属性列表中没有明确指定的值, 使用下表中的默认值, 指定一个属性值, EGL将保证返回一个可以的最小的匹配.

如果eglChooseConfig返回成功, 可以用这些信息去创建窗口并绘制图形, 否则不能指定要渲染的窗口类型

//创建的窗口支持5位红蓝、6位绿色(RGB565格式)
bool EglChooseConfigs(EGLDisplay &display)
{
    EGLint attribList[] = 
    {
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
        EGL_RED_SIZE, 5,
        EGL_GREEN_SIZE, 6,
        EGL_BLUE_SIZE, 5,
        EGL_DEPTH_SIZE, 1,
        EGL_NONE
    };

    const EGLint MAXConfigs = 10;
    EGLConfig configs[MAXConfigs];
    EGLint numConfigs;
    if (!eglChooseConfig(display, attribList, configs, MAXConfigs, &numConfigs))
        return FALSE;
}

EGL 配置属性默认值和匹配法则

属性

数据类型

默认值

排序优先级

选择顺序

EGL_BUFFER_SIZE

int

0

3

Smaller value

EGL_RED_SIZE

int

0

2

Larger value

EGL_GREEN_SIZE

int

0

2

Larger value

EGL_BLUE_SIZE

int

0

2

Larger value

EGL_ALPHA_SIZE

int

0

2

Larger value

EGL_CONFIG_CAVET

enum

EGL_DONT_CARE

1(first)

Exact value

EGL_CONFIG_ID

int

EGL_DONT_CARE

9

Exact value

EGL_DEPTH_SIZE

int

0

6

Smaller value

EGL_LEVEL

int

0

-

Equal value

EGL_NATIVE_RENDERABLE

Boolean

EGL_DONT_CARE

-

Exact value

EGL_NATIVE_VISUAL_TYPE

int

EGL_DONT_CARE

8

Exact value

EGL_SAMPLE_BUFFERS

int

0

4

Smaller value

EGL_SAMPLES

int

0

5

Smaller value

EGL_STENCIL_SIZE

int

0

7

Smaller value

EGL_SURFACE_TYPE

bitmask

EGL_WINDOW_BIT

-

Mask value

EGL_TRANSPARENT_TYPE

enum

EGL_NONE

-

Exact value

EGL_TRANSPARENT_RED_VALUE

int

EGL_DONT_CARE

-

Exact value

EGL_TRANSPARENT_GREEN_VALUE

int

EGL_DONT_CARE

-

Exact value

EGL_TRANSPARENT_BLUE_VALUE

int

EGL_DONT_CARE

-

Exact value

注意:排序优先级为空的不能使用排序
具体含义可以在opengl es2.0编程指南中查询
4.egl创建窗口的完整实例:
EGLBoolean initializeWindow(EGLNativeWindowType 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, 2,
        EGL_NONE
    };


    EGLDisplay dpy;
    dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if(dpy == EGL_NO_DISPLAY)
        return FALSE;


    EGLint major, minor;
    if (!eglInitialize(dpy, &major, &minor))
        return FALSE;


    EGLConfig config;
    EGLint numConfigs;
    if (!eglChooseConfig(dpy, configAttribs, &config, 1, &numConfigs))
        return FALSE;


    EGLSurface window;
    window = eglCreateWindowSurface(dpy, config, nativeWindow, NULL);
    if (window == EGL_NO_SURFACE)
        return EGL_FALSE;


    EGLContext context;
    context = eglCreateContext(dpy, config, EGL_NO_CONTEXT, contextAttribs);
    if (context == EGL_NO_CONTEXT)
        return FALSE;


    if (!eglMakeCurrent(dpy, window, window, context))
        return FALSE;


    return TRUE;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值