【问题标题】:GLSurfaceView with OpenGL ES 3.1 context具有 OpenGL ES 3.1 上下文的 GLSurfaceView
【发布时间】:2015-12-22 07:36:09
【问题描述】:

我正在使用 OpenGL 开发 Android。我知道如何使用GLSurfaceView 及其自定义派生类通过GLSurfaceView 方法创建OpenGL ES 2.0 上下文:

setEGLContextClientVersion(2); 

和 OpenGL ES 3.0 上下文:

setEGLContextClientVersion(3); 

如何为 OpenGL ES 3.1 创建上下文?

【问题讨论】:

  • 这可能可以通过推出自定义 GLSurfaceView 来完成。我知道将 OpenGL ES 渲染到 TextureView 中需要一些自定义的东西。我参考了GLSurfaceView source (not official),以了解如何创建 EGL 上下文并指定正确的主要和次要 GLES 版本号。

标签: java android opengl-es-2.0 opengl-es-3.0 opengl-es-3.1


【解决方案1】:

创建上下文时,您不能明确请求 3.1。根据我的理解,3.1 没有作为与 3.0 分开的上下文类型来处理。本质上,支持 3.1 的上下文只是一个 3.0 上下文,它还支持附加的 3.1 功能。

这意味着你仍然可以使用:

setEGLContextClientVersion(3);

如果您想检查/验证上下文支持的版本,您可以在上下文启动并运行后查询它:

int[] vers = new int[2];
GLES30.glGetIntegerv(GLES30.GL_MAJOR_VERSION, vers, 0);
GLES30.glGetIntegerv(GLES30.GL_MINOR_VERSION, vers, 1);
if (vers[0] > 3 || (vers[0] == 3 && vers[1] >= 1)) {
    // We have at least ES 3.1.
}

背景

最新版本的 EGL,即 1.5 [*],实际上确实具有允许指定主要和次要版本的上下文创建属性(属性 EGL_CONTEXT_MAJOR_VERSIONEGL_CONTEXT_MINOR_VERSION)。 1.4 及以下的版本只有EGL_CONTEXT_CLIENT_VERSION,因此它们没有在创建上下文时指定次要版本的机制。

最新发布的 Android 版本是 5.1.1 [*],仍然只支持 EGL 1.4。所以这不仅仅是GLSurfaceView不提供接口的问题。较低的原生层也不支持指定次要版本。所以为 3.0 上下文添加 3.1 支持确实是唯一的选择。

[*] 撰写此答案时。

【讨论】:

  • 注意:GLSurfaceView 不支持 GLES 3 pre-Lollipop (5.0)。如果您需要 KitKat 和更早版本中的 GLES 3,则需要使用普通的 SurfaceView 并自己进行 EGL 设置。 (见android.googlesource.com/platform/frameworks/base/+/…。)
  • @fadden 我在 KitKat 系统上使用了 ES 3.0 和 GLSurfaceView。查看代码后,我不完全确定它为什么会起作用。一种可能性是供应商对 GLSurfaceView 进行了必要的修改。此外,上下文创建直接采用指定的版本。只有配置选择看起来不完整。因此,如果您覆盖配置选择器,或者供应商对不同版本使用相同的配置(他们大多这样做),那么一切都会奏效。
  • 我相信你的话——我看到“如果不是 2,那么它一定是 1”,不久就放弃了。我很失望代码继续默默地接受不受支持的值。 FWIW,3.1 的主要优势在于 Google Play 等商店中的应用程序,您可以在其中指定基线功能级别。 IIRC 各种移动 GPU 供应商已经在其 3.0 驱动程序中拥有大部分或全部 3.1 功能,但应用程序开发人员需要更多的工作来运行时测试功能并为不受支持的扩展提供低质量的回退,因此他们倾向于为最小的公分母。
  • 在 EGL 1.5 上的发现很好,我刚刚意识到 EGL 1.4 实际上没有这个。我找到了EGL 1.5 spec,它在第 51-52 页上详细说明了这些新属性以及它们如何与eglCreateContext 函数结合使用。
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多