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 中国大陆许可协议进行许可。

posted @   I加加  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.