谷歌的 OpenGL ES 库 Angle PBuffer 测试代码(Windows 平台)()-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");
}
————————
/* 这个例子是 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");
}