簡體   English   中英

混合OpenGL ES 2.0和3.0

[英]Mixing OpenGL ES 2.0 and 3.0

我正在嘗試將iOS項目移植到Android(java)。 然而,我遇到了一些ES 2.0擴展功能(OES),它們沒有出現在Android GLES20 API中:

glGenVertexArraysOES glBindVertexArrayOES glDeleteVertexArraysOES

看來我必須從NDK調用這些函數,在運行時動態綁定擴展並檢查支持od設備。 不是我喜歡做的事情。

谷歌搜索時我在GLES30 api中找到了這些功能。 所以我的問題是: - 可以混合使用GLES20和G​​LES30嗎? - 這些函數基本上是調用相同的API還是完全不同? - 任何其他建議?

只看API入口點,ES 3.0是ES 2.0的超集。 所以轉型大多是順利的。 您在進行GLSurfaceView.setEGLContextClientVersion()調用時請求API版本3,並且您的ES 2.0代碼仍然有效。 然后,您可以在GLES20方法的GLES30上開始使用GLES20方法。

存在一些非常細微的差異,例如與立方體圖采樣中的微小差異有關,但您不太可能遇到它們。 如果需要詳細信息,請參閱規范文檔的附錄F.2。 客戶端頂點陣列等一些功能已被聲明為遺留功能,但仍受支持。

你唯一可能遇到的是GLSL的差異。 只要在着色器代碼中保留#version 100 ,您仍然可以使用ES 2.0着色器。 但如果您想使用最新的GLSL版本( #version 300 es ),則會出現不兼容的更改。 必要的代碼更改很簡單,它主要是替換attribute並隨着inoutvarying ,而不再使用內置的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。

正如@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

功能相同。 在GLES20中,它們僅存在於某些設備上,而不是強制擴展。 在GLES30中,它們是強制性的。

如果您在GLES30中使用它們,您的應用程序將僅適用於支持GLES30的設備(僅適用於Android 4.4的設備)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM