关于 opengl 与 EGL 的理解

一些基本的理解。

 

 

 

 

 

 

 也就是说 对于 API小子,来说,他们调用的接口时一样的,但是面对 各样的 显示,肯定有EGL 与dispaly 直接的对接,那么时谁做的这件事呢? 估计是原厂。

EGL的基本的步骤:

 

 什么是 opengles :

 

 

 

 

 

 

 说白了, EGL 就是 对opengl es 的在封装, 但它肯定还跟 具体的屏幕相关。

 

需要的开发资料 : 瑞芯微官方的视频说明, 一些关于opengles 的书籍。

 

先来看看 瑞芯微方法的一些资料。

 

 

 

只看 , libmail -->mail--->gpu , 视频上说 kernel 不用管,已经内置了,主要移植 libmali。 这个我在 3568 的 debian 的 构建脚本中见过。

 

 

 

 

网上也有一些 关于 ubunut的使用 opengles 的一些资料,我可以尝试一下。

 

一些个 关于 opengles  egl 的介绍。

 

 

 

 

 

 

关于 egl 与 opengles 的区别

 

 

也就是是说, egl 之所以可以跨平台是因为 ,这部分适配别人帮你做了。

 

在 debian 的系统上 先实现一个窗口。

环境:  rk3568 开发板

    网盘上 debian 的镜像。

 

程序:

sudo apt-get install libx11-dev

  • #include <X11/Xlib.h>
  •  
  • int main() {
  • Display *display;
  • Window window;
  • XEvent event;
  •  
  • /* 打开与X服务器的连接 */
  • display = XOpenDisplay(NULL);
  •  
  • /* 创建窗口 */
  • window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, 400, 300, 0, 0, WhitePixel(display, 0));
  •  
  • /* 选择要监听的事件 */
  • XSelectInput(display, window, ExposureMask | KeyPressMask);
  •  
  • /* 显示窗口 */
  • XMapWindow(display, window);
  •  
  • /* 进入消息循环 */
  • while (1) {
  • XNextEvent(display, &event);
  •  
  • /* 处理Expose事件 */
  • if (event.type == Expose) {
  • /* 绘制窗口内容 */
  • XFillRectangle(display, window, DefaultGC(display, 0), 20, 20, 360, 260);
  • }
  •  
  • /* 处理KeyPress事件 */
  • if (event.type == KeyPress)
  • break;
  • }
  •  
  • /* 关闭与X服务器的连接 */
  • XCloseDisplay(display);
  •  
  • return 0;
  • }
gcc -o window window.c -lX11

运行结果如下:

 

关于 opengles 设置颜色的说明,网上的资料

 

 

 

 

 

在3568 的底板上运行一个 opengles 的例子

sudo apt-get install libgles2-mesa-dev libegl1-mesa-dev libx11-dev

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <EGL/egl.h>
  5. #include <GLES2/gl2.h>
  6. #include <X11/Xlib.h>
  7. #include <X11/Xutil.h>
  8.  
  9. #define WINDOW_WIDTH 800
  10. #define WINDOW_HEIGHT 600
  11.  
  12. int main()
  13. {
  14. Display *display;
  15. Window window;
  16. XEvent event;
  17. EGLDisplay eglDisplay;
  18. EGLConfig eglConfig;
  19. EGLSurface eglSurface;
  20. EGLContext eglContext;
  21. EGLint numConfigs;
  22. EGLint majorVersion;
  23. EGLint minorVersion;
  24.  
  25. // 初始化X11窗口系统
  26. display = XOpenDisplay(NULL);
  27. if (display == NULL) {
  28. fprintf(stderr, "Error: Unable to open X display\n");
  29. return 1;
  30. }
  31. window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, 0);
  32. XSetStandardProperties(display, window, "OpenGL ES Example", "OpenGL ES Example", None, NULL, 0, NULL);
  33. XSelectInput(display, window, ExposureMask | KeyPressMask);
  34. XMapWindow(display, window);
  35.  
  36. // 初始化EGL
  37. eglDisplay = eglGetDisplay(display);
  38. eglInitialize(eglDisplay, &majorVersion, &minorVersion);
  39. eglBindAPI(EGL_OPENGL_ES_API);
  40. eglChooseConfig(eglDisplay, NULL, &eglConfig, 1, &numConfigs);
  41. eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, window, NULL);
  42. eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, NULL);
  43. eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
  44.  
  45. // 渲染循环
  46. bool running = true;
  47. while (running) {
  48. while (XPending(display) > 0) {
  49. XNextEvent(display, &event);
  50. if (event.type == Expose) {
  51. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  52. glClear(GL_COLOR_BUFFER_BIT);
  53. eglSwapBuffers(eglDisplay, eglSurface);
  54. } else if (event.type == KeyPress) {
  55. running = false;
  56. }
  57. }
  58. }
  59.  
  60. // 清理资源
  61. eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
  62. eglDestroyContext(eglDisplay, eglContext);
  63. eglDestroySurface(eglDisplay, eglSurface);
  64. eglTerminate(eglDisplay);
  65. XDestroyWindow(display, window);
  66. XCloseDisplay(display);
  67.  
  68. return 0;
  69. }


gcc -o opengles_example opengles_example.c -lEGL -lGLESv2 -lX11
运行的结果如下: 
显示了一个黑框。

 

 

posted @   看星星的派大星  阅读(839)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-11-01 向量的内积,外积,混合积
2020-11-01 一元回归的标准化回归系数与R平方值
点击右上角即可分享
微信分享提示