当前位置: 首页 > wzjs >正文

外贸网站 设计直接下载app

外贸网站 设计,直接下载app,电脑去哪里建设网站,工业设计案例网站文章目录1. EGL是什么?2. EGL的使用流程2.1 在线渲染2.2 离屏渲染1. EGL是什么? EGL(Embedded-System Graphics Library)​​ 是 Khronos Group 制定的标准接口,用于 ​管理 OpenGL ES / OpenVG 与本地窗口系统之间的…

文章目录

  • 1. EGL是什么?
  • 2. EGL的使用流程
    • 2.1 在线渲染
    • 2.2 离屏渲染

1. EGL是什么?

EGL(Embedded-System Graphics Library)​​ 是 Khronos Group 制定的标准接口,用于 ​管理 OpenGL ES / OpenVG 与本地窗口系统之间的交互。它相当于一个“中间层”,解决以下问题:

  • ​跨平台兼容性​:不同操作系统(Android、Linux、Windows 等)的窗口系统差异。
  • ​资源管理​:创建渲染表面(Surface)、上下文(Context)、缓冲区等。
  • 多API支持​:支持 OpenGL ES、OpenGL、OpenVG 等多种图形API。
EGLDisplay (连接显示系统)│├── EGLSurface (渲染目标:窗口或离屏缓冲区)│└── EGLContext (渲染状态和环境)│└── OpenGL ES 绘制命令

2. EGL的使用流程

EGL 的初始化流程有严格的顺序要求,错误顺序会导致崩溃或上下文创建失败。
​标准流程​:

  1. 获取 Display​ → eglGetDisplay()
  2. ​初始化 EGL​ → eglInitialize()
  3. 绑定 API​ → eglBindAPI()(明确使用 OpenGL ES 还是 OpenGL)
  4. 选择 Config​ → eglChooseConfig()。EGL Config 决定了渲染表面的属性(如颜色深度、深度缓冲区、模板缓冲区等)。
  5. 创建 Surface​ → eglCreateWindowSurface()(在线渲染)或者eglCreatePbufferSurface()(离屏渲染)
  6. ​创建 Context​ → eglCreateContext()
  7. ​绑定 Context 和 Surface​ → eglMakeCurrent()

EGL 资源必须手动释放,且顺序与创建相反:

  • 解绑 Context → eglMakeCurrent(…, EGL_NO_CONTEXT)
  • 销毁 Context → eglDestroyContext()
  • 销毁 Surface → eglDestroySurface()
  • 终止 Display → eglTerminate()

​注意事项​:

  • 在 eglInitialize() 之前调用 eglChooseConfig() 会直接失败。
  • 单线程绑定​:eglMakeCurrent() 会将 Context 绑定到当前线程,同一线程只能绑定一个 Context。
  • 多线程渲染​:需在每个线程单独创建和绑定 Context,并共享资源(通过 eglCreateContext() 的 share_context 参数)。
  • ​解绑时机​:在销毁 Context 前必须调用 eglMakeCurrent(…, EGL_NO_CONTEXT)。

若使用 ​PBuffer​ 或 ​FBO​ 离屏渲染:

  • PBuffer​:通过 eglCreatePbufferSurface() 创建,需指定宽高。
  • ​FBO​:更灵活,但需额外管理帧缓冲和纹理附件。
  • 性能优化​:离屏渲染可能比窗口渲染更快(无垂直同步限制)。

2.1 在线渲染

#include <EGL/egl.h>
#include <GLES3/gl3.h>EGLDisplay eglDisplay;
EGLSurface eglSurface;
EGLContext eglContext;bool initOnScreenEGL() {// 1. 获取默认显示连接eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);if (eglDisplay == EGL_NO_DISPLAY) return false;// 2. 初始化 EGLEGLint major, minor;if (!eglInitialize(eglDisplay, &major, &minor)) return false;// 3. 选择配置const EGLint configAttribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,EGL_SURFACE_TYPE, EGL_WINDOW_BIT,EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_ALPHA_SIZE, 8,EGL_DEPTH_SIZE, 24,EGL_NONE};EGLConfig eglConfig;EGLint numConfigs;if (!eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &numConfigs)) return false;// 4. 创建窗口表面(绑定到原生窗口)// 安卓端从 SurfaceHolder 获取 ANativeWindowANativeWindow* nativeWindow = ANativeWindow_fromSurface(env, surface);eglCreateWindowSurface(display, config, window, nullptr);eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, nullptr);  if (eglSurface == EGL_NO_SURFACE) return false;// 5. 创建上下文const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3,EGL_NONE};eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs);if (eglContext == EGL_NO_CONTEXT) return false;// 6. 绑定上下文和表面if (!eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) return false;return true;
}void renderFrame() {glClearColor(0.2f, 0.3f, 0.4f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 绘制代码...eglSwapBuffers(eglDisplay, eglSurface); // 交换缓冲区,显示到屏幕
}void cleanup() {eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);eglDestroyContext(eglDisplay, eglContext);eglDestroySurface(eglDisplay, eglSurface);eglTerminate(eglDisplay);
}

2.2 离屏渲染

#include <EGL/egl.h>
#include <GLES3/gl3.h>EGLDisplay eglDisplay;
EGLSurface eglSurface; // PBuffer Surface
EGLContext eglContext;bool initOffScreenEGL(int width, int height) {// 1. 获取默认显示连接eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);if (eglDisplay == EGL_NO_DISPLAY) return false;// 2. 初始化 EGLEGLint major, minor;if (!eglInitialize(eglDisplay, &major, &minor)) return false;// 3. 选择配置(不需要 EGL_WINDOW_BIT)const EGLint configAttribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, // 使用 PBufferEGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_ALPHA_SIZE, 8,EGL_DEPTH_SIZE, 24,EGL_NONE};EGLConfig eglConfig;EGLint numConfigs;if (!eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &numConfigs)) return false;// 4. 创建 PBuffer 表面(离屏渲染目标)const EGLint pbufferAttribs[] = {EGL_WIDTH, width,EGL_HEIGHT, height,EGL_NONE};eglSurface = eglCreatePbufferSurface(eglDisplay, eglConfig, pbufferAttribs);if (eglSurface == EGL_NO_SURFACE) return false;// 5. 创建上下文const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3,EGL_NONE};eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs);if (eglContext == EGL_NO_CONTEXT) return false;// 6. 绑定上下文和 PBuffer 表面if (!eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) return false;return true;
}void renderToTexture() {GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);// 绑定 FBO 并渲染到纹理GLuint fbo;glGenFramebuffers(1, &fbo);glBindFramebuffer(GL_FRAMEBUFFER, fbo);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);glClearColor(1.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 绘制代码...glBindFramebuffer(GL_FRAMEBUFFER, 0); // 解绑 FBO
}void cleanup() {eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);eglDestroyContext(eglDisplay, eglContext);eglDestroySurface(eglDisplay, eglSurface);eglTerminate(eglDisplay);
}

文章转载自:

http://M5F6JmQR.mrnnb.cn
http://pYdfbZ2b.mrnnb.cn
http://EJeIuDAI.mrnnb.cn
http://ukjwMzbw.mrnnb.cn
http://ZN8RgCDm.mrnnb.cn
http://IHg5N1nP.mrnnb.cn
http://pahh7j9s.mrnnb.cn
http://7ZC0dzYi.mrnnb.cn
http://KAW5XJUi.mrnnb.cn
http://R5I5wUQ0.mrnnb.cn
http://pyqDDevy.mrnnb.cn
http://hPhByVw0.mrnnb.cn
http://DxlqFHPw.mrnnb.cn
http://4JqvnswU.mrnnb.cn
http://6vlogXta.mrnnb.cn
http://HAdCYwTU.mrnnb.cn
http://s1W19uXh.mrnnb.cn
http://lLaj2jkK.mrnnb.cn
http://iCvmHXIW.mrnnb.cn
http://aHnmRm5I.mrnnb.cn
http://ncUzhNZO.mrnnb.cn
http://x4zl0AB5.mrnnb.cn
http://IqeiGnLN.mrnnb.cn
http://CZ5NSLFm.mrnnb.cn
http://zbxQ8k3K.mrnnb.cn
http://bi3heBN6.mrnnb.cn
http://G6WOL5zb.mrnnb.cn
http://JjdTkuIy.mrnnb.cn
http://QqVfbB7g.mrnnb.cn
http://qdiVyCnW.mrnnb.cn
http://www.dtcms.com/wzjs/766533.html

相关文章:

  • 昆明做网站建设技巧公司做网站的属于什么工作类型
  • 小网站怎么建设wordpress2012主题二次开发
  • 郑州电商网站建设吉林省建设工程管理系统
  • 长沙网站优化怎么做电子政务与网站建设意义
  • 南高齿网站是谁做的小型公众号开发
  • 公司需要网站 该怎么做网站策划与建设阶段应该做什么
  • 成都网站建设网站制作公司葫芦岛建设网站
  • 网站推广的基本手段wordpress评论表单
  • 网站用户体验福建手机版建站系统开发
  • 带孩子做网站做网站优化推广多少钱
  • 9e做网站备案的网站程序上传
  • 做网站 除了域名自己制作wordpress子主题
  • 品牌网站什么意思长春企业免费建站
  • 设计师找图网站女孩子做电商运营是不是压力很大
  • 广园路建设公司网站免费cdn服务器
  • c 做网站网站鑫灵锐做网站多少钱
  • 网站群内容管理系统的设计与实现wordpress用redis和mem
  • 小程序和网站开发难度厦门seo服务
  • 宁夏城乡住房建设厅网站做自媒体查找素材的网站
  • 企业网站内容策划wordpress禁用admin用户
  • 网站开发支持上传gif杭州人才网
  • 网站是哪个公司做的菜鸟制作个人网站网页实例
  • 做外贸应该去什么网站wordpress登录链接
  • seo网站关键词优化工具wordpress iis 中文乱码
  • 直播网站建设1个节点多少钱贵阳做网站软件
  • 网站建设流程时间表不良网站代码怎么查
  • 具有价值的响应式网站建程网土石方工程
  • 济南润尔网站建设技术公司江西赣州公司
  • 代理下单网站开发广州小型企业网站建设
  • 什么网站做简历模板宁波 手机网站建设