android - 混合 OpenGL ES 2.0 和 3.0

标签 android opengl-es

我正在尝试将 iOS 项目移植到 Android (java)。然而,我遇到了一些 ES 2.0 扩展函数 (OES),它们没有出现在 Android GLES20 API 中:

glGenVertexArraysOES glBindVertexArrayOES glDeleteVertexArraysOES

看来我必须从 NDK 调用这些函数,在运行时动态绑定(bind)扩展并检查设备的支持。这不是我喜欢做的事情。

通过谷歌搜索,我在 GLES30 api 中找到了这些函数。所以我的问题是: - 是否可以混合调用 GLES20 和 GLES30? - 这些功能基本上是调用相同的 api 还是完全不同? - 还有其他建议吗?

最佳答案

只看 API 入口点,ES 3.0 是 ES 2.0 的超集。所以过渡大部分是顺利的。您在调用 GLSurfaceView.setEGLContextClientVersion() 时请求 API 版本 3,您的 ES 2.0 代码应该仍然有效。然后,您可以在 GLES20 方法之上开始使用 GLES30 中的方法。

有一些非常细微的差异,例如与立方体贴图采样的细微差异有关,但您不太可能遇到它们。如果需要详细信息,请参阅规范文档的附录 F.2。客户端顶点数组等一些功能已被宣布为旧版,但仍受支持。

您唯一可能遇到的是 GLSL 中的差异。只要在着色器代码中保留 #version 100,您仍然可以使用 ES 2.0 着色器。但是如果你想使用最新的 GLSL 版本(#version 300 es),会有不兼容的变化。必要的代码更改很简单,主要是将 attributevarying 替换为 inout,而不是使用内置 gl_FragColor 了。如果您想利用某些新的 ES 3.0 功能,例如多个渲染目标,您必须切换到新的 GLSL 版本。

使用 ES 3.0 的缺点当然是您在运行软件的设备上受到更多限制。虽然最新的高端设备大多支持 ES 3.0,但仍有大量设备仅支持 2.0,并将保持在该级别。根据 Google (http://developer.android.com/about/dashboards/index.html) 的最新数据,截至 2014 年 7 月 7 日,所有设备中有 18.2% 支持 ES 3.0。

关于android - 混合 OpenGL ES 2.0 和 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24903517/

相关文章:

c# - 如何在一个按钮中设置两种不同大小的文本,android api > 24

带定时器的 Android(Java) 生产者/消费者

android - 如何为 Marvel Api 请求发送时间戳和 md5 哈希

ios - Swift:使用 OpenGL (glReadPixels) 创建 UIImage

android - 如何处理 libGDX 中的不同纵横比?

Android:在 GLSurfaceView 中创建纹理会从标准硬件加速 View 元素中删除纹理

java - 如何通过字符两个字节的电子邮件地址验证输入日语?

java - SMS 服务所需的类或接口(interface)?

arrays - 我应该从结构和类切换到数组吗?

java - 房间内的光源出乎意料地起作用