混合OpenGL ES 2.0和3.0

sim*_*scu 3 android opengl-es

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

glGenVertexArraysOES glBindVertexArrayOES glDeleteVertexArraysOES

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

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

Ret*_*adi 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),则会出现不兼容的更改.必要的代码更改很简单,它主要是更换attributevaryinginout,而不是使用内置的gl_FragColor了.你必须切换到新版本的GLSL如果你想利用一些新ES 3.0的功能,如多渲染目标.

使用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.