zoukankan      html  css  js  c++  java
  • OpenGl ES实施

    1.get显示器句柄

    EGLDisplay* egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    // or
    EGLNativeDisplayType hDisplayType = static_cast<EGLNativeDisplayType>(fbGetDisplayByIndex(0));
    EGLDisplay* egl_display = eglGetDisplay(hDisplayType );

    2.初始化EGL

    eglInitialize(egl_display, &majorVer, &minorVer);

    EGL将在初始化时,返回主要和次要版本

    2.1 选择配置

    EGLint attributes[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR. EGL_NONE};
    EGLConfig config;
    EGLint config_count;
    bool chosen = eglChooseConfig(display, attributes, config, 1, &config_count);

    3.创建窗口

    4.获取上下文环境

    // 传参获取到的显示器句柄和配置值
    EGLint  context_attribs[] =
    {
        EGL_CONTEXT_CLIENT_VERSION , 3,
        EGL_NONE
    };

    EGLContext context = eglCreateContext(egl_display, config, NULL, context_attribs);

    5.设置上下文环境

    eglMakeCurrent(egl_display, windowSurface, windowSurface, context);

    6.bind API

    eglBindAPI(EGL_OPENGL_ES_API);

    实施code

    #include <stdio.h>
    #include <EGL/egl.h>
    #include <EGL/eglext.h>
    #include <EGL/eglplatform.h>
    #include <EGL/eglvivante.h>
    
    #include <GLES2/gl2.h>
    #include <GLES2/gl2ext.h>
    #include <GLES3/gl31.h>
    
    int main(int argc, char **argv)
    {
        // 1.get display
          EGLNativeDisplayType hDisplayType = static_cast<EGLNativeDisplayType>(fbGetDisplayByIndex(0));
        EGLDisplay  display = eglGetDisplay(hDisplayType);
        if (EGL_SUCCESS != eglGetError()) {
            printf("get display error
    ");
        }
    
        // 2.init
        EGLint major, minor;
        eglInitialize(display, &major, &minor);
    
        // 3.choose config
        EGLint attribs[] = 
        {
            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
            EGL_NONE
        };
        EGLConfig configs[100];
        EGLint config_size = 0;
        EGLint num_config;
        bool res_chose = eglChooseConfig(display, attribs, configs, config_size, &num_config);
        if (EGL_SUCCESS != eglGetError()) {
            printf("choose config error
    ");
        }
        if (res_chose) {
            printf("3.choose OK num_config[%d]
    ", num_config);
        }
        else {
            printf("3.choose failed
    ");
        }
    
        // 4.create context
        printf("4.create context begin
    ");
        EGLContext context;
        int num = 0;
        EGLint  context_attribs[] =
        {
            EGL_CONTEXT_CLIENT_VERSION , 3,
            EGL_NONE
        };
        for (int i = 0; i < num_config; i++) {
            context = eglCreateContext(display, configs[i], EGL_NO_CONTEXT, context_attribs);
            if (EGL_SUCCESS != eglGetError()) {
                printf("create context error
    ");
            }
            else {
                printf("i[%d]
    ", i);
                num = i;
                break;
            }
        }
        printf("4.create context end
    ");
    
        // create surface
        EGLint surfAttribs[] =
        {
            EGL_COLORSPACE, EGL_COLORSPACE_sRGB,
            EGL_NONE
        };
        int m_width = 1;
        int m_height = 1;
        EGLNativeWindowType win = (EGLNativeWindowType)fbCreateWindow(hDisplayType, 0, 0, m_width, m_height);
        EGLSurface surface =  eglCreateWindowSurface(display, configs[num], win, surfAttribs);
        if (EGL_SUCCESS != eglGetError()) {
            printf("create surface error
    ");
        }
    
        // 5.make current
        printf("5.make current begin
    ");
        eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context);
        // eglMakeCurrent(display, surface, surface, context);
        if (EGL_SUCCESS != eglGetError()) {
            printf("make current error
    ");
        }
        if (EGL_NO_CONTEXT != context && eglGetCurrentContext() == context) {
            printf("5.make current OK
    ");
        }
        else {
            printf("5.make current failed
    ");
        }
    
        // 6.bind API
        printf("6.bind opengl es API begin
    ");
        bool res_bind = eglBindAPI(EGL_OPENGL_ES_API);
        if (EGL_SUCCESS != eglGetError()) {
            printf("bind API error
    ");
        }
        if (res_bind) {
            printf("6.bind OK
    ");
        }
        else {
            printf("6.bind failed
    ");
        }
    
        // 7.test gl api
        printf("7.test egl version[%s]
    ", eglQueryString(display, EGL_VERSION));
        printf("7.test version_name[%s]
    ", glGetString(GL_VERSION));
        GLint major_version = 0;
        GLint minor_version = 0;
        glGetIntegerv(GL_MAJOR_VERSION, &major_version);
        glGetIntegerv(GL_MINOR_VERSION, &minor_version);
        printf("7.test glGetIntegerv major[%d] minor[%d]
    ", major_version, minor_version);
        if (glGetError() == GL_NO_ERROR) {
            printf("7.test gl error api OK
    ");
        }
        else {
            printf("7.test gl error api failed
    ");
        }
    
    }

    断开连接和释放

    eglMakeCurrent(display, EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT);
    eglDestroySurface(display, surface);
    eglDestroyContext(display, context);
    eglTerminate(display);
  • 相关阅读:
    python中列表排序的方法
    pyrhon3中字符串方法
    python数据探索与数据与清洗概述
    2020年日期表-python实现
    python中字符串离散化的例子
    python中常见的日期处理方法
    如何简单地理解Python中的if __name__ == '__main__'
    我的老爸老了
    关于
    关于
  • 原文地址:https://www.cnblogs.com/mayfly-xlc/p/12803408.html
Copyright © 2011-2022 走看看