谷歌的 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
 *   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");
}

 文章来源地址https://www.toymoban.com/news/detail-482220.html

/* 这个例子是 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");}

到了这里,关于谷歌的 OpenGL ES 库 Angle PBuffer 测试代码(Windows 平台)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谷歌的Bard和OpenAI的GPT4的对比

    随着上个月21日谷歌面向公众开放人工智能聊天机器人Bard的访问权限,同样是上个月的14日OpenAI为聊天机器人ChatGPT发布的最新语言模型:GPT-4的问世,可以说关于ChatGPT应用的推出进入了百家争鸣的情况,而且竞争变得激烈起来,越来越多的行业巨头都在研制自己ChatGPT应用,除

    2023年04月09日
    浏览(57)
  • 接入谷歌的语音识别(speech-to-text)

    讲一下写这篇文章的背景。 因为需求需要,我们APP需要做一个语音转化成文字的功能。因为我们做的是海外产品,需要支持多语言,当前对多语言语音识别支持的最好的解决方案当属谷歌家的了。通过对谷歌的speech-to-text调研和一些其他原因,我们决定通过服务端去接入谷歌

    2024年02月12日
    浏览(43)
  • 免费搜索vs付费搜索:百度谷歌的有力竞争者刚刚出现!

    北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理 人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典 搜索引擎的游戏刚刚被改变! 人们对昨天(12月1号)OpenAI 发布的最新聊天机器人产品的反应非常积极。

    2024年02月09日
    浏览(35)
  • 探索谷歌的Certificate Transparency Go库:透明、安全的HTTPS时代

    项目地址:https://gitcode.com/google/certificate-transparency-go 在数字证书世界中,保证HTTPS的安全性是至关重要的。然而,传统的证书验证机制存在潜在缺陷,可能导致中间人攻击。为了解决这一问题,谷歌推出了Certificate Transparency(CT)项目,并提供了一个强大的Go语言实现—— cer

    2024年04月16日
    浏览(28)
  • 谷歌的人工智能原则 | AI at Google: our principles

    目录 Objectives for AI applications 人工智能应用的目标 1. Be socially beneficial.  1. 对社会有益。

    2024年02月09日
    浏览(46)
  • 谷歌的智能AI聊天机器人Bard已免费开放申请,赶紧加入等待列表体验一把

    2023年,真是一个Ai元年,随意ChatGPT的大火,各路网络巨头都按捺不住了,Google更是一度启动了红色警报,这是有史以来,谷歌感受到最大的压力,不过谷歌平时也并不是没有技术沉淀的,其实很最就已经有Ai智能自然语言机器人了,LaMDA甚至都已经有了情感了,所以谷歌与及

    2024年02月06日
    浏览(48)
  • 【人工智能】谷歌的巴德聊天机器人向公众开放 | Google‘s Bard Chatbot Opens to the Public

      Google is trying to balance AI progress with caution. 谷歌正试图谨慎地平衡人工智能的进展。 目录 https://bard.google.com/

    2024年02月09日
    浏览(44)
  • Anthropic的Claude3和Open AI的ChatGPT以及谷歌的Gemini三大模型的区别以及如何注册升级Claude 3,GPT-4的使用体验,避免封号等

    最近几天Anthropic发布了Claude 3 系列的LLM大模型,这也太快了吧!而且 官方声称这个模型超越了当今的OpenAI的ChatGPT-4 模型以及谷歌的Gemini Ultra模型啊 。 现在Claude 3的Opus模型,可能有更大的影响。这个时候不知道Open AI是不是要准备发布GPT-4.5了。下面是Anthropic官方的一个数据分

    2024年03月12日
    浏览(48)
  • OpenGL-ES 学习(4)---- OpenGL-ES 坐标体系

    坐标体系 我们知道 OpenGL -ES 坐标系中每个顶点的 x,y,z 坐标都应该在 -1.0 到 1.0 之间,超出这个坐标范围的顶点都将不可见。 将一个物体(图像)渲染到屏幕上,通常经过将物体坐标转换为标准化设备坐标,然后再将标准化设备坐标转化为屏幕坐标的过程。 ( 将物体坐标转

    2024年02月19日
    浏览(36)
  • OpenGL 和 OpenGL ES基础知识

    当今许多视觉应用程序,从简单的游戏到高级工程领域,都使用OpenGL(Open Graphics Library)和OpenGL ES(OpenGL for Embedded Systems)作为其图形渲染API。这些API提供了一种跨平台、可移植且高性能的图形编程解决方案,支持大量不同类型的设备和操作系统。 在本篇博客中,我们将深入

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包