在 Linux 中创建 OpenGLES 的渲染上下文需要以下几个步骤:
对于基于 Debian 的系统(如 Ubuntu),可以使用以下命令安装这些库:
sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev libx11-dev
opengles_example.c
的文件,并添加以下代码:#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <X11/Xlib.h>
#include<stdio.h>
#include <stdlib.h>
int main() {
// 初始化 X11 显示
Display* xDisplay = XOpenDisplay(NULL);
if (!xDisplay) {
printf("Error: Unable to open X display\n");
return -1;
}
// 获取默认屏幕
int screen = DefaultScreen(xDisplay);
// 创建 X11 窗口
Window rootWindow = RootWindow(xDisplay, screen);
Window xWindow;
XSetWindowAttributes windowAttributes;
windowAttributes.event_mask = ExposureMask | KeyPressMask;
xWindow = XCreateWindow(xDisplay, rootWindow, 0, 0, 800, 600, 0, CopyFromParent, InputOutput, CopyFromParent, CWEventMask, &windowAttributes);
XMapWindow(xDisplay, xWindow);
// 初始化 EGL
EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)xDisplay);
if (eglDisplay == EGL_NO_DISPLAY) {
printf("Error: Unable to get EGL display\n");
return -1;
}
if (!eglInitialize(eglDisplay, NULL, NULL)) {
printf("Error: Unable to initialize EGL\n");
return -1;
}
// 选择 EGL 配置
static const EGLint configAttribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_DEPTH_SIZE, 24,
EGL_STENCIL_SIZE, 8,
EGL_NONE
};
EGLint numConfigs;
EGLConfig eglConfig;
eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &numConfigs);
// 创建 EGL 窗口表面
EGLNativeWindowType eglWindow = (EGLNativeWindowType)xWindow;
EGLSurface eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, eglWindow, NULL);
// 创建 EGL 上下文
static const EGLint contextAttribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
EGLContext eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs);
// 将 EGL 上下文与表面关联
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
// 清除颜色缓冲区
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 交换缓冲区
eglSwapBuffers(eglDisplay, eglSurface);
// 等待用户按键
XEvent event;
while (1) {
XNextEvent(xDisplay, &event);
if (event.type == KeyPress) {
break;
}
}
// 释放资源
eglDestroyContext(eglDisplay, eglContext);
eglDestroySurface(eglDisplay, eglSurface);
eglTerminate(eglDisplay);
XDestroyWindow(xDisplay, xWindow);
XCloseDisplay(xDisplay);
return 0;
}
gcc -o opengles_example opengles_example.c -lEGL -lGLESv2 -lX11
./opengles_example
这将创建一个窗口,并使用 OpenGLES 进行渲染。当你按下任意键时,程序将退出。