混合OpenGL ES 2.0和3.0

时间:2014-07-23 06:44:27

标签: android opengl-es

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

glGenVertexArraysOES glBindVertexArrayOES glDeleteVertexArraysOES

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

谷歌搜索时我在GLES30 api中找到了这些功能。所以我的问题是: - 是否可以混合使用GLES20和G​​LES30? - 这些函数基本上是调用相同的API还是完全不同? - 任何其他建议?

3 个答案:

答案 0 :(得分:5)

只看API入口点,ES 3.0是ES 2.0的超集。所以转型大多是顺利的。您在进行GLSurfaceView.setEGLContextClientVersion()调用时请求API版本3,并且您的ES 2.0代码仍然有效。然后,您可以在GLES30方法的基础上开始使用GLES20中的方法。

有一些非常微妙的差异,例如与立方体图采样的细微差别有关,但您不太可能遇到它们。如果需要详细信息,请参阅规范文档的附录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。

答案 1 :(得分:2)

正如@vadimvolk解释的那样,您需要检查OpenGL驱动程序是否支持OES_vertex_array_object扩展名。更多信息: http://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt

如果你只是坚持使用OpenGL ES 3.0,你可以在检查你有OpenGL ES 3.0上下文后使用这些方法。在Android中,您可以将调用混合到GLES20GLES30,因为这些API是向后兼容的。 您只需要创建OpenGL ES 2.0上下文并通过读取GL_VERSION字符串来检查返回的上下文版本是否为3.0。如果是3.0,则可以使用混合GLES20GLES30函数。其他信息:https://plus.google.com/u/0/+RomainGuy/posts/iJmTjpUfR5E

答案 2 :(得分:1)

功能相同。在GLES20中,它们仅存在于某些设备上,而不是强制扩展。 在GLES30中,它们是强制性的。

如果您在GLES30中使用它们,您的应用程序将仅适用于支持GLES30的设备(仅适用于Android 4.4的设备)。