首页 > 系统相关 >Windows 下 EGL PBuffer 测试代码

Windows 下 EGL PBuffer 测试代码

时间:2024-09-19 19:25:33浏览次数:7  
标签:printf Windows egl EGL 测试代码 PBuffer include eglDisplay GLAD

  Windows 上使用 glad 加载浏览器的 LibEGL.dll 和 LibGLESV2.dll,测试 EGL 在 Windows 上的实现,代码:

  1 #include <stdio.h>
  2 
  3 #include "include/glad/egl.h"
  4 #include "include/glad/gles3.2.h"
  5 
  6 #define STB_IMAGE_WRITE_IMPLEMENTATION
  7 #include "include/stb_image_write.h"
  8 
  9 #ifdef GLAD_GLES2
 10 #include "src/egl.c"
 11 #include "src/gles3.2.c"
 12 #endif
 13 
 14 /* 这个例子是 Windows 平台测试谷歌的 Angle 库,PBuffer 的创建。用到了 GLAD 的 EGL 和 GLES 2.x、GLES 3.x 模块。
 15  *
 16  * 用到的 Angle 的动态链接库是:
 17  *
 18  *   d3dcompiler_47.dll
 19  *   libEGL.dll
 20  *   libGLESv2.dll
 21  *
 22  * 这三个 dll 很多软件带了,比如 vscode(64位),很多浏览器的目录,也可以自己下载 Angle 的源码编译。 
 23  */
 24 
 25 /* HDC      可以是任意窗口的 HDC,相当于 Windows 平台的 display,这里可以设置成 NULL(无窗口依赖)
 26  *
 27  */
 28 int test_pbuffer(HDC hdc)
 29 {
 30     int n;
 31 
 32     #if defined(GLAD_EGL_H_) || defined(GLAD_EGL)
 33 
 34     // 先用 GLAD 加载 EGL 的函数
 35     n = gladLoaderLoadEGL(0);
 36     if (n == 0) {
 37         printf("egl> gladLoaderLoadEGL() = %d\n", n);
 38         return -1;
 39     }
 40     else {
 41         printf("egl> gladLoaderLoadEGL() = %d\n", n);
 42     }
 43     #endif
 44 
 45     // EGL 版本参数
 46     EGLint ai32ContextAttribs[] = {
 47         EGL_CONTEXT_CLIENT_VERSION, 2,
 48         EGL_NONE, EGL_NONE
 49     };
 50 
 51     // 获取 EGL display
 52     EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType) hdc);
 53 
 54     // 初始化 EGL
 55     eglInitialize(eglDisplay, 0, 0);
 56 
 57     // 绑定 OpenGL ES API。这个函数在 Windows 平台是空,OpenGL ES 的函数稍后我们用 GLAD 加载
 58     if (eglBindAPI) {
 59         eglBindAPI(EGL_OPENGL_ES_API);
 60     }
 61 
 62     // 设置 OpenGL ES 初始化参数
 63     EGLint pi32ConfigAttribs[] = {
 64         //EGL_SURFACE_TYPE, EGL_WINDOW_BIT,         // 绘制到窗口,配合上面的 HDC 句柄
 65         EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,          // 使用 PBuffer
 66         EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,    // OpenGL ES 版本
 67         EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,      // 颜色缓冲格式
 68         EGL_BLUE_SIZE, 8,
 69         EGL_GREEN_SIZE, 8,
 70         EGL_RED_SIZE, 8,
 71         EGL_ALPHA_SIZE, 8,
 72         EGL_DEPTH_SIZE, 24,
 73         EGL_STENCIL_SIZE, 8,
 74         EGL_NONE, EGL_NONE
 75     };
 76 
 77     // 选择 display 设置属性
 78     int iConfigs;
 79     EGLConfig eglConfig;
 80     eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs);
 81 
 82     if (iConfigs != EGL_TRUE) {
 83         printf("egl> Error: eglChooseConfig(): config not found.\n");
 84         return -1;
 85     }
 86 
 87     // 创建 PBuffer 表面
 88     EGLint pBufferAttribs[] = {
 89         EGL_WIDTH, 800,
 90         EGL_HEIGHT, 600,
 91         EGL_LARGEST_PBUFFER, EGL_TRUE,
 92         EGL_NONE, EGL_NONE
 93     };
 94     EGLSurface eglSurface = eglCreatePbufferSurface(eglDisplay, eglConfig, pBufferAttribs);
 95 
 96     if (!eglSurface) {
 97         printf("egl> pbuffer surface create failed.\n");
 98         return -1;
 99     }
100 
101     // 创建 OpenGL ES 上下文
102     EGLContext eglContext;
103     eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);
104 
105     // 绑定 OpenGL ES 上下文
106     eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
107 
108     // 使用 GLAD 加载 GLES 的函数
109     #if defined(GLAD_GLES2_H_) || defined(GLAD_GLES2)
110     n = gladLoaderLoadGLES2();
111     if (n == 0) {
112         printf("egl> gladLoaderLoadGLES2() = %d\n", n);
113         return -1;
114     }
115     else {
116         printf("egl> gladLoaderLoadGLES2() = %d\n", n);
117     }
118     #endif
119 
120     //
121     // 从这里开始,可以使用普通的 OpenGL (ES) 函数
122     //
123 
124     // 清屏
125     glClearColor(0.0, 0.5, 1.0, 1.0);
126     glClear(GL_COLOR_BUFFER_BIT);
127 
128     // 读取颜色缓冲区
129     uint8_t* buf = (uint8_t*) malloc(800 * 600 * 4);
130     glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, buf);
131 
132     // 使用 stb_image_write 保存图片,如果程序目录看到一张蓝色背景的图片,说明测试成功。
133     stbi_write_png("test.png", 800, 600, 4, buf, 0);
134     printf("gles> save test.png ok.\n");
135 
136     delete buf;
137 
138     // EGL 的反转缓冲区
139     eglSwapBuffers(eglDisplay, eglSurface);
140 
141     // 取消绑定上下文
142     eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
143 
144     // 释放 EGL 环境
145     eglDestroyContext(eglDisplay, eglContext);
146     eglDestroySurface(eglDisplay, eglSurface);
147     eglTerminate(eglDisplay);
148 
149     printf("egl> test ok.\n");
150 }
151 
152 int main(int argc, char* argv[])
153 {
154     test_pbuffer(NULL);
155 
156     system("pause");
157 
158     return 0;
159 }

 

标签:printf,Windows,egl,EGL,测试代码,PBuffer,include,eglDisplay,GLAD
From: https://www.cnblogs.com/sdragonx/p/18421196

相关文章

  • windows安装docker
    环境准备启用Hyper-V打开windows功能,找到Hyper-V并勾选,如果找不到Hyper-V新建txt,然后编辑内容pushd"%~dp0"dir/b%SystemRoot%\servicing\Packages\*Hyper-V*.mum>hyper-v.txtfor/f%%iin('findstr/i.hyper-v.txt2^>nul')dodism/online/norestart/add-p......
  • 修复Windows系统中mt6.dll文件缺失或损坏的问题——了解mt6.dll错误的原因及有效的解
    在使用Windows操作系统时,有时会遇到诸如“找不到mt6.dll”或“mt6.dll已损坏”等错误信息。这些问题可能会阻止应用程序的正常运行,给用户带来不便。本文将探讨这些问题的常见原因,并提供有效的解决方法,帮助用户快速恢复正常操作。原因分析文件缺失:用户可能无意中删除了mt6.......
  • Windows安装时调出系统的cmd功能 Shift+F10
    Windows安装时调出系统的cmd功能Shift+F10(笔记本可能是Shift+FN+F10)比如可以转换磁盘分区形式。 在Windows安装程序中同时按下【Shift+F10】键以打开命令提示符窗口,并按顺序输入以下命令。 diskpart listdisk(会显示磁盘列表) selectdisk1(1为要安装......
  • windows无法安装到这个磁盘,选中的磁盘采用gpt分区
    在安装Windows时,出现“windows无法安装到这个磁盘,选中的磁盘采用gpt分区”的错误提示,可以尝试两种解决方法:方法一,通过Diskpart工具将GPT转换为MBR;方法二,将引导模式更改为UEFI模式。以上是解决此问题的方法。摘要由作者通过智能技术生成有用有些用户反馈在安装Windows的过......
  • 从方法、操作流程等方面对Windows和Linux的命令进行对比
    Windows和Linux是两个常见的操作系统,它们都有自己的命令行接口。尽管两者的目的都是相同的——执行特定的任务,但它们的命令之间存在一些差异。下面将从方法、操作流程等方面对Windows和Linux的命令进行对比。一、文件和目录操作:列出目录中的文件:–Windows命令:dir–Linux命......
  • Windows sver 2012
    DHCP安装DHCP......
  • Hadoop Windows下安装
    1.下载winutils:https://github.com/s911415/apache-hadoop-3.1.0-winutils,替换bin文件hadoop:3.2.0tar解压2.环境变量hadoopversion验证问题:Error:java_homeisincorrectlyset解决:由于jdk在C盘引起:hadoop-env.cmd加入setJAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_112......
  • 在Windows10中使用rust的diesel库
    介绍最近在学习ActixWeb时,需要用到数据库操作,简单尝试了一下diesel,也遇到了一些问题。在这里记录一下,供大家参考。1.安装根据Diesel官网介绍,使用cargobinstall安装dieselcli。cargobinstalldiesel_cli如果报错error:nosuchcommand:`binstall`需要先安装cargo-bi......
  • 如何快速创建一台Windows云服务器?
    轻量应用服务器(TencentCloudLighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、小程序/小游戏、电商、云盘/图床以及各类开发测试和学习环境,相比普通云服务器更加简单易用,提供高带宽流量包并以套餐形式整体售卖基础云资......
  • 京东云轻量云主机搭建幻兽帕鲁服务器教程 - Windows系统
    《幻兽帕鲁》是一款备受瞩目的开放世界生存建造游戏,近期在游戏界非常火爆。玩家可以在游戏世界中收集神奇的生物“帕鲁”,并利用它们进行战斗、建造、农耕、工业生产等各种活动。与其他开放世界游戏不同,要想实现多人联机游戏,玩家需要自行搭建服务器。本教程将详细介绍如何在京东云......