当前位置: 首页 >  网站大师 >  谷歌的 OpenGL ES 库 Angle PBuffer 测试代码(Windows 平台)

谷歌的 OpenGL ES 库 Angle PBuffer 测试代码(Windows 平台)

导读:/* 这个例子是 Windows 平台测试谷歌的 Angle 库,PBuffer 的创建。用到了 GLAD 的 EGL 和 GLES 2.x、GLES 3.x 模块。.*.* 用到的 Angle 的动态链接库是:.*.* d3dcompiler_47.dll.* libE

/* 这个例子是 Windows 平台测试谷歌的 Angle 库,PBuffer 的创建。用到了 GLAD 的 EGL 和 GLES 2.x、GLES 3.x 模块。
 *
 * 用到的 Angle 的动态链接库是:
 *
 *   d3dcompiler_47.dll
 *   libEGL.dll
 *   libGLESv2.dll
 *
 * 这三个 dll 很多软件带了,比如 vscode(64位),很多浏览器的目录,也可以自己下载 Angle 的源码编译。 
 */

/* HDC      可以是任意窗口的 HDC,相当于 Windows 平台的 display,这里可以设置成 NULL(无窗口依赖)
 *
 */
int test_pbuffer(HDC hdc)
{
    int n;

    #if defined(GLAD_EGL_H_) || defined(GLAD_EGL)

    // 先用 GLAD 加载 EGL 的函数
    n = gladLoaderLoadEGL(0);
    if (n == 0) {
        printf("egl> gladLoaderLoadEGL() = %d\n", n);
        return -1;
    }
    else {
        printf("egl> gladLoaderLoadEGL() = %d\n", n);
    }
    #endif

    // EGL 版本参数
    EGLint ai32ContextAttribs[] = {
        EGL_CONTEXT_CLIENT_VERSION, 2,
        EGL_NONE, EGL_NONE
    };

    // 获取 EGL display
    EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType) hdc);

    // 初始化 EGL
    eglInitialize(eglDisplay, 0, 0);

    // 绑定 OpenGL ES API。这个函数在 Windows 平台是空,OpenGL ES 的函数稍后我们用 GLAD 加载
    if (eglBindAPI) {
        eglBindAPI(EGL_OPENGL_ES_API);
    }

    // 设置 OpenGL ES 初始化参数
    EGLint pi32ConfigAttribs[] = {
        //EGL_SURFACE_TYPE, EGL_WINDOW_BIT,         // 绘制到窗口,配合上面的 HDC 句柄
        EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,          // 使用 PBuffer
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,    // OpenGL ES 版本
        EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,      // 颜色缓冲格式
        EGL_BLUE_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_RED_SIZE, 8,
        EGL_ALPHA_SIZE, 8,
        EGL_DEPTH_SIZE, 24,
        EGL_STENCIL_SIZE, 8,
        EGL_NONE, EGL_NONE
    };

    // 选择 display 设置属性
    int iConfigs;
    EGLConfig eglConfig;
    eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs);

    if (iConfigs != EGL_TRUE) {
        printf("egl> Error: eglChooseConfig(): config not found.\n");
        return -1;
    }

    // 创建 PBuffer 表面
    EGLint pBufferAttribs[] = {
        EGL_WIDTH, 800,
        EGL_HEIGHT, 600,
        EGL_LARGEST_PBUFFER, EGL_TRUE,
        EGL_NONE, EGL_NONE
    };
    EGLSurface eglSurface = eglCreatePbufferSurface(eglDisplay, eglConfig, pBufferAttribs);

    if (!eglSurface) {
        printf("egl> pbuffer surface create failed.\n");
        return -1;
    }

    // 创建 OpenGL ES 上下文
    EGLContext eglContext;
    eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);

    // 绑定 OpenGL ES 上下文
    eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);

    // 使用 GLAD 加载 GLES 的函数
    #if defined(GLAD_GLES2_H_) || defined(GLAD_GLES2)
    n = gladLoaderLoadGLES2();
    if (n == 0) {
        printf("egl> gladLoaderLoadGLES2() = %d\n", n);
        return -1;
    }
    else {
        printf("egl> gladLoaderLoadGLES2() = %d\n", n);
    }
    #endif

    //
    // 从这里开始,可以使用普通的 OpenGL (ES) 函数
    //

    // 清屏
    glClearColor(0.0, 0.5, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    // 读取颜色缓冲区
    uint8_t* buf = (uint8_t*) malloc(800 * 600 * 4);
    glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, buf);

    // 使用 stb_image_write 保存图片,如果程序目录看到一张蓝色背景的图片,说明测试成功。
    stbi_write_png("test.png", 800, 600, 4, buf, 0);
    printf("gles> save test.png ok.\n");

    delete buf;

    // EGL 的反转缓冲区
    eglSwapBuffers(eglDisplay, eglSurface);

    // 取消绑定上下文
    eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);

    // 释放 EGL 环境
    eglDestroyContext(eglDisplay, eglContext);
    eglDestroySurface(eglDisplay, eglSurface);
    eglTerminate(eglDisplay);

    printf("egl> test ok.\n");
}

/* 这个例子是 Windows 平台测试谷歌的 Angle 库,PBuffer 的创建。用到了 GLAD 的 EGL 和 GLES 2.x、GLES 3.x 模块。 * * 用到的 Angle 的动态链接库是: * * d3dcompiler_47.dll * libEGL.dll * libGLESv2.dll * * 这三个 dll 很多软件带了,比如 vscode(64位),很多浏览器的目录,也可以自己下载 Angle 的源码编译。 /
/
HDC 可以是任意窗口的 HDC,相当于 Windows 平台的 display,这里可以设置成 NULL(无窗口依赖) * /int test_pbuffer(HDC hdc){ int n;
#if defined(GLAD_EGLH) || defined(GLAD_EGL)
// 先用 GLAD 加载 EGL 的函数 n = gladLoaderLoadEGL(0); if (n == 0) { printf(“egl> gladLoaderLoadEGL() = %d\n”, n); return -1; } else { printf(“egl> gladLoaderLoadEGL() = %d\n”, n); } #endif
// EGL 版本参数 EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE };
// 获取 EGL display EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType) hdc);
// 初始化 EGL eglInitialize(eglDisplay, 0, 0);
// 绑定 OpenGL ES API。这个函数在 Windows 平台是空,OpenGL ES 的函数稍后我们用 GLAD 加载 if (eglBindAPI) { eglBindAPI(EGL_OPENGL_ES_API); }
// 设置 OpenGL ES 初始化参数 EGLint pi32ConfigAttribs[] = { //EGL_SURFACE_TYPE, EGL_WINDOW_BIT, // 绘制到窗口,配合上面的 HDC 句柄 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, // 使用 PBuffer EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // OpenGL ES 版本 EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, // 颜色缓冲格式 EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_STENCIL_SIZE, 8, EGL_NONE, EGL_NONE };
// 选择 display 设置属性 int iConfigs; EGLConfig eglConfig; eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs);
if (iConfigs != EGL_TRUE) { printf(“egl> Error: eglChooseConfig(): config not found.\n”); return -1; }
// 创建 PBuffer 表面 EGLint pBufferAttribs[] = { EGL_WIDTH, 800, EGL_HEIGHT, 600, EGL_LARGEST_PBUFFER, EGL_TRUE, EGL_NONE, EGL_NONE }; EGLSurface eglSurface = eglCreatePbufferSurface(eglDisplay, eglConfig, pBufferAttribs);
if (!eglSurface) { printf(“egl> pbuffer surface create failed.\n”); return -1; }
// 创建 OpenGL ES 上下文 EGLContext eglContext; eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);
// 绑定 OpenGL ES 上下文 eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
// 使用 GLAD 加载 GLES 的函数 #if defined(GLAD_GLES2H) || defined(GLAD_GLES2) n = gladLoaderLoadGLES2(); if (n == 0) { printf(“egl> gladLoaderLoadGLES2() = %d\n”, n); return -1; } else { printf(“egl> gladLoaderLoadGLES2() = %d\n”, n); } #endif
// // 从这里开始,可以使用普通的 OpenGL (ES) 函数 //
// 清屏 glClearColor(0.0, 0.5, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT);
// 读取颜色缓冲区 uint8_t
buf = (uint8_t*) malloc(800 * 600 * 4); glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, buf);
// 使用 stb_image_write 保存图片,如果程序目录看到一张蓝色背景的图片,说明测试成功。 stbi_write_png(“test.png”, 800, 600, 4, buf, 0); printf(“gles> save test.png ok.\n”);
delete buf;
// EGL 的反转缓冲区 eglSwapBuffers(eglDisplay, eglSurface);
// 取消绑定上下文 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
// 释放 EGL 环境 eglDestroyContext(eglDisplay, eglContext); eglDestroySurface(eglDisplay, eglSurface); eglTerminate(eglDisplay);
printf(“egl> test ok.\n”);}

内容
  • Qt-FFmpeg开发-打开本地摄像头录制视频(7)
    Qt-FFmpeg开发-打开本地
    2023-12-05
    音视频/FFmpeg #Qt.Qt-FFmpeg开发-打开本地摄像头录制视频【软解码+ OpenGL显示YUV】.目录.
  • 一种新的告警收敛方式“先知预警”,为您的系统健康护航
    一种新的告警收敛方式“先知预警”
    2023-12-08
    前言.简介.买基金,上京东.基金交易系统是用户使用京东金融APP进行基金交易的核心支撑系统,每天有数十亿元的交易额。.在
  • 4.10 x64dbg 反汇编功能的封装
    4.10 x64dbg 反汇编功
    2023-12-06
    LyScript.插件提供的反汇编系列函数虽然能够实现基本的反汇编功能,但在实际使用中,可能会遇到一些更为复杂的需求,此
  • 如何在unity中手写一个四叉树地形lod系统(二)
    如何在unity中手写一个四叉树
    2023-12-07
    在根据四叉树节点创建了1365个地形分块网格并保存到本地后,我们接下来要在游戏运行的过程中动态地显示所需的网格,这是最关
  • windows 网络模拟工具分享
    windows 网络模拟工具分享
    2023-12-02
    【下载地址】.Releases · jagt/clumsy · GitHub.【介绍】.无需安装.无需篡改和代理.系统级
  • 常用的 http 状态码有哪些?
    常用的 http 状态码有哪些?
    2023-12-08
    在我们进行网页,网址的访问过程中,http,https.都是我们主要使用到的协议,在使用这协议的时候,对于他的协助状态,