问题标签 [egl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
26418 浏览

linux - 什么是 EGL 以及如何使用它

谁能解释一下什么是 EGL 以及它的作用?

如何在 Linux 上将 EGL 与 OpenGL-ES 一起使用?

EGL 是硬件和操作系统之间的一层吗?

0 投票
4 回答
6739 浏览

android - GLSurfaceView.Renderer 可以在 onDrawFrame() 中多次交换缓冲区吗?

在我的 openGL 游戏中,我通常使用 onDrawFrame() 中的 GLSurfaceView.Renderer 类来绘制场景。但是,当我显示加载屏幕时,我想在加载每个数据项后强制屏幕绘制,以便显示加载栏。

是否可以在此绘制调用期间以某种方式强制进行缓冲区交换?我唯一的选择是在多个帧之间错开加载,这意味着大量的返工..

我想我要调用的是 eglSwapBuffers() 但我找不到从 GLSurfaceView 或 GLSurfaceView.Renderer 访问 egl 上下文的方法。

感谢您的时间。

0 投票
3 回答
31413 浏览

opengl - EGL和OpenGL有什么关系?

我正在为 Go 中的 OpenVG 和 OpenGL|ES 编写一个实现,它们依赖Khronos EGL API,我猜应该是为了简化可移植性。

出于有趣和教育的原因,我正在 OpenGL ES 之上编写 OpenVG 的实现——我没有做很多渲染工作,我想了解更多关于开放 API 和实践实现定义良好的标准(更容易看看我是否得到了正确的结果)。

据我了解,EGL 提供了一个标准 API 来检索绘图上下文(或任何正确的名称),而不是使用多个操作系统提供的 API(GLX、WGL 等)之一

在此处输入图像描述

我很难相信 Khronos 会经历这样的努力并将标准 OpenGL 排除在外,但问题是,我还没有发现 OpenGL(真正的交易)如何或是否与 EGL 接口,或者它是否只是 OpenGL ES。如果 OpenGL ES 可以使用来自 EGL 的绘图上下文,那么标准 OpenGL 也可以工作吗?

我对这一切都很陌生,这就是为什么我很兴奋,但我正在做的真正项目是一个 Go 小部件工具包,它利用 OpenVG 进行绘图操作并尽可能使用硬件加速。

如果 OpenVG、OpenGL 和 OpenGL ES 依赖于 EGL,我想我的问题可以用“是”或“否”来回答。请记住,我昨晚一头扎进了这个主题。

OpenGL 是使用还是依赖于 EGL?


离题,但没有 EGL 标签。应该有吗?

0 投票
2 回答
4849 浏览

android - Android EGL/OpenGL ES 帧率卡顿

TL;博士

即使根本不进行绘图,在 Android 设备上的 OpenGL ES 渲染线程上保持 60Hz 的更新率似乎也是不可能的。神秘的尖峰经常出现(在底部的代码中显示),我为弄清楚为什么或如何导致死胡同所做的一切努力。在使用自定义渲染线程的更复杂示例中,时间始终显示 eglSwapBuffers() 是罪魁祸首,通常超过 17ms-32ms。帮助?

更多细节

这尤其糟糕,因为我们项目的渲染要求是屏幕对齐的元素以固定的高速水平从屏幕一侧平滑滚动到另一侧。换句话说,一个平台游戏。从 60Hz 频繁下降会导致明显的爆裂和倾斜,无论有无基于时间的运动。由于滚动速度很高,因此不能选择以 30Hz 渲染,这是设计中不可协商的部分。

我们的项目是基于 Java 的,以最大限度地提高兼容性并使用 OpenGL ES 2.0。我们只深入了解 API 7-8 设备上的 OpenGL ES 2.0 渲染和 API 7 设备上的 ETC1 支持的 NDK。在它和下面给出的测试代码中,除了我无法控制的日志打印和自动线程之外,我没有验证分配/GC 事件。

我已经在使用库存 Android 类且没有 NDK 的单个文件中重新创建了该问题。下面的代码可以粘贴到在 Eclipse 中创建的新 Android 项目中,只要您选择 API 级别 8 或更高级别,它就应该可以开箱即用。

该测试已在具有一系列 GPU 和操作系统版本的各种设备上重现:

  • 银河标签 10.1 (Android 3.1)
  • Nexus S (Android 2.3.4)
  • 银河 S II (Android 2.3.3)
  • XPERIA Play (Android 2.3.2)
  • 机器人不可思议 (Android 2.2)
  • Galaxy S(Android 2.1-update1)(将 API 要求降至 7 级时)

示例输出(从运行时间不到 1 秒的时间收集):

我一直在追这个有一段时间了,几乎撞到了一堵砖墙。如果修复不可用,那么至少解释一下为什么会发生这种情况以及如何在具有类似要求的项目中克服这个问题的建议将不胜感激。

示例代码

0 投票
3 回答
3069 浏览

android - EGL_BAD_MATCH 与 Droid/Droid 2

我一直在各种手机上测试我的 OpenGL ES 2 应用程序。我在使用 Droid 和 Droid 2 时遇到了问题。我尝试的每个 EGL 配置都会导致 EGL_BAD_MATCH。

我尝试了许多 EGL 配置的组合,包括适用于其他手机的配置,每种组合都会产生 EGL_BAD_MATCH。

有没有人遇到过这个问题或知道任何解决方案?

谢谢

0 投票
2 回答
3316 浏览

graphics - EGL_KHR_IMAGE <- 它是什么以及我应该何时使用它

有人可以用简单的术语解释什么是 egl 图像,以及我何时想要使用的示例吗?我知道它可以显着提高性能,但我在查找文档时遇到了麻烦。在我尝试并真正弄清楚之前,我想确保它甚至值得学习。

谢谢。

0 投票
2 回答
1798 浏览

qt - 在 EGL 上渲染时的 OpenGL 撕裂效果

我在 ARM 板上的 EGL 实现提供的表面上使用 OpenGL 渲染了一些 Qt 应用程序。我在渲染中遇到了某种撕裂。

通过阅读,我发现这可能是与 vsync 相关的问题,因此我使用了 EGL 调用 eglSwapInterval(eglDisplay, 1),但仍然存在撕裂。这个电话足以消除撕裂吗?该调用是否应该完全消除这种影响?是否有可能留下一些撕裂的痕迹?

0 投票
1 回答
1759 浏览

android - Android NativeActivity OpenGL-ES 原生应用程序:如何获得小于全屏的表面

我有使用 Google 的 native_app_glue 包装器的原生 Android 应用程序。我想获得一个小于全屏的表面来渲染 GLES。在使用从 Activity 派生的 java 层的 GLES 应用程序中,这是通过 Java 层中的 getWindow().setLayer() 完成的。但是,我的项目情况不允许我使用此解决方案。

通过 nativeActivtiy 和 native_app_glue 层,我可以使用 JNI 获取 Java 类和回调到 Java,但不能修改视图层次结构。通过 JNI 从我的 C 代码回调 setLayers() 时,我收到此错误,因为 NativeActivity 与创建 View 层次结构的线程不在同一个线程中。

E/AndroidRuntime(21503): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸它的视图。

这是我的代码:

你们中的一些人可能建议的解决方案是使用 glViewport() 绘制到小于全屏。此解决方案在视觉上有效,但性能很差,因为 EGL 驱动程序仍在处理全屏表面。

我想知道这种方法是否是最好的解决方案,因为它在架构上与使用本机应用程序包装器相比有很大的变化:a)放弃本机应用程序胶水包装器并在与 JVM 相同的线程中运行本机代码(或至少一部分)b)从 NativeActivity 派生一个 Java 类,它通过 setContentView() 创建视图层次结构 c) 在与 Java 相同的线程中运行的本机代码中使用 JNI 调用 setLayout() d) 其余的本机代码可以根据需要在不同的线程中运行

我不确定上述方法是否可行,我是否会遇到障碍。

0 投票
1 回答
10497 浏览

android - 如何在 EGL 或 GLSurfaceView 中设置 OpenGL 版本?

对于我正在处理的 OpenGL Android 项目,我需要 ES 2.0,但我需要控制我习惯于使用 EGL 实现的渲染缓冲区/表面。因为我想不出任何方法来使用 GLSurfaceView 渲染到屏幕外缓冲区,然后从不显示缓冲区。即使我使用 GLSurfaceView.EGLContextFactory,如果没有 Android 的 EGL 包中未包含的 EGL 1.2 函数/常量(例如 EGL_CONTEXT_CLIENT_VERSION),我也想不出任何方法来完成此任务。

所以第一个明显的问题是:有没有办法 1)尽管省略了 EGL_CONTEXT_CLIENT_VERSION 和 eglBindAPI(),但还是使用 EGL 和 ES 2.0?2) 在调用 GLSurfaceView 的回调 surfaceCreated(EGLConfig) 之前,是否有一些新的 API 用于设置渲染上下文?

0 投票
1 回答
1201 浏览

x11 - 如何为 GPGPU 创建一个不可见的 X11 窗口?

是否可以创建一个不可见的 X 窗口?对于 OpenGL ES 2.0 上下文的初始化,必须手动创建一个 X 窗口,但我找不到使其不可见的方法。因为我只做 GPGPU 我不需要输出窗口。事实上,就我而言,这很烦人。

我从较早的问题中知道了一个解决方案,该问题已被指出InputOnlyXCreateWindow(). 然而,这会导致 X 错误GLXBadDrawable。可能是因为 EGL 需要窗口来响应图形请求。还有其他方法吗?也许创建它最小化?但我也找不到任何东西。将窗口的大小设置得非常小也无济于事,因为它总是占据我设备(诺基亚 N9)上的整个屏幕。