X11+EGL+OPENGLES程序流程
X11+EGL+OPENGLES程序流程
未完待续
摘要
本文旨在介绍Linux环境下X11+EGL+OPENGLES的基本程序流程,重点在于X11、EGL相关配置,OpenGL和着色器代码并不是重点
-
我会按照涉及的组件进行拆分,主要拆分为X11、EGL、OpenGL
在最后我会给出完整代码
X11
打开与X11服务器的连接
Display *x11_display = XOpenDisplay(NULL);
获取根窗口
Window x11_root = XDefaultRootWindow(x11_display);
配置窗口属性,接收暴露、鼠标移动、按键事件
XSetWindowAttributes x11_swa = {.event_mask = ExposureMask | PointerMotionMask | KeyPressMask};
Window x11_window = XCreateWindow(
x11_display, x11_root,
0, 0, width, height, 0,
CopyFromParent, InputOutput,
CopyFromParent, CWEventMask,
&x11_swa);
设置窗口关闭请求
Atom x11_s_wm_deleta_message = XInternAtom(x11_display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(x11_display, x11_window, &x11_s_wm_deleta_message, 1);
设置窗口属性,窗口管理器可以控制窗口的位置和显示
XSetWindowAttributes x11_attr = {.override_redirect = 0};
XChangeWindowAttributes(x11_display, x11_window, CWOverrideRedirect, &x11_attr);
设置提示,窗口可以接收输入
XWMHints x11_hints = {.flags = InputHint, .input = 1};
XSetWMHints(x11_display, x11_window, &x11_hints);
将窗口映射到屏幕上进行显示,设置窗口名称
XMapWindow(x11_display, x11_window);
XStoreName(x11_display, x11_window, title);
设置窗口的状态
Atom x11_wm_state = XInternAtom(x11_display, "_NET_WM_STATE", 0);
XEvent x11_ev = {.type = ClientMessage};
x11_ev.xclient.window = x11_window;
x11_ev.xclient.message_type = x11_wm_state;
x11_ev.xclient.format = 32;
x11_ev.xclient.data.l[0] = 1;
x11_ev.xclient.data.l[1] = 0;
XSendEvent(x11_display, DefaultRootWindow(x11_display), 0, SubstructureNotifyMask, &x11_ev);
当前这些代码,稍作修改然后编译是可以运行的,可以启动一个什么都没有的窗口,由于我们没有处理事件,它也不能被顺利关闭
如果你想尝试,需要增加的内容:
- 头文件X11/Xlib.h和X11/Xutil.h
- 定义好width、height、title变量
- 在最后加个死循环或getchar()阻止程序退出
- 还需要链接libX11.so
EGL
获取EGL显示连接,EGL是一个接口层,这里用于在X11(或其它显示系统,比如gbm)创建OpenGL上下文
EGLDisplay egl_display = eglGetDisplay(x11_display);
初始化EGL,返回版本号,这一步比较重要
eglInitialize(egl_display, &major_version, &minor_version)
创建并选择下显示属性
EGLint attrib_list[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_DEPTH_SIZE, 8,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
EGL_SAMPLE_BUFFERS, 0,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
EGL_NONE};
eglChooseConfig(egl_display, attrib_list, egl_configs, 1, &num_configs)
创建窗口表面,用于渲染输出
EGLSurface egl_surface = eglCreateWindowSurface(egl_display, egl_config, x11_window, NULL);
创建上下文
EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
EGLContext egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, context_attribs);
绑定上下文
eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)
EGL在连接实际的显示系统时有不少问题可能需要处理,因此上述接口在调用时要十分注意错误的检查和处理
GL
本文作者:I加加
本文链接:https://www.cnblogs.com/ippfcox/p/18733950
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通