2016-03-24 131 views
4

我一直在努力編寫一些可以在任何地方工作的opengl代碼,但不會限制自己太多。
我想在僅支持它的設備上使用opengles2,而在支持的設備上使用opengl core。OpenGL與OpenGLES2的兼容性

此外,我希望能夠在運行時(如果有的話)選擇使用哪一個。

我的問題是:
如果我每次可用時間鏈接到我的代碼與OpenGL庫,然後創建一個GLES2或GL核心方面,將GLES2方面表現得完全一樣GLESv2庫?這會產生什麼影響,標題明智? 例如,GLESv2沒有定義BGRA紋理格式,所以我想我必須將全部轉換爲RGBA。這不是什麼麻煩,但我有興趣瞭解替代品。

我想過動態加載庫和加載所有使用的函數指針,但這是一個大量的工作,可能有一個更容易的答案。 在這種情況下,我只包含glext.h,併爲所使用的函數聲明所有的函數指針,並填充它們。 這裏的問題是,glext沒有定義任何數據類型(glenum等),所以我總是要包含gl.h.通過包含兩者,我得到gl.h函數聲明和我自己的函數指針聲明,所以我不能只使用函數指針的一般名稱空間...即使如此,一些函數(如glGetError)似乎並不像爲其函數指針提供關聯的typedef。我很瞭解GLEW,但不幸的是,大多數Linux發行版都分發了一個仍然不兼容GLES2的版本(debian,我在看着你)。它只是段錯誤。

你們會怎麼做?任何其他方法的opengl函數鏈接?

回答

1

我在航空航天工業,我可以使用各種OpenGL子集,因爲每個硬件提供者都有自己的版本。 (我喜歡用完整的文件描述......以及任何事情)。似乎我們確實有類似的問題。我會給你我迄今爲止學到的。

首先,您將希望朝着您可以獲得的所有配置文件中最大的badest超集發展。使用硬件供應商提供的最新版本的OpenGL頭。這樣你的程序至少可以解決編譯部分。

BGRA宏/枚舉將成爲您的GLESv2運行時的一部分,但如果您的平臺僅支持RGBA,您將永遠不會在運行時使用它。

基於平臺功能的運行時決策基於OpenGL擴展列表進行。將擴展列表與應用程序使用的任何內容進行比較,停用不支持的分支並激活受支持的分支。您可以通過這種方式區分OpenGL和GLES。