2012-04-27 109 views
6

OpenGL ES聲稱是OpenGL的子集,理論上意味着任何OpenGL ES程序都可以在PC上像常規OpenGL一樣運行;然而,看起來OpenGL ES對於某些功能的命名約定略有不同(glOrtho vs glOrthof)。這很重要嗎? OpenGL ES應用程序可以使用OpenGL GPU /驅動程序直接使用還是隻需重新編譯?OpenGL向後兼容OpenGL ES嗎?

回答

9

OpenGL ES應用程序是否可以使用開箱即用的OpenGL GPU /驅動程序,或僅使用重新編譯?

號均田,但因爲你長大glOrtho,這意味着你在談論ES 1.x的,而不是2.x中,不適合你。 ES 3.0增加了一些新的東西;詳情請見底部。

OpenGL ES 1.x不是任何版本的OpenGL的子集。他們有一些非常顯着的差異。你可能會可能能夠編碼到一個共同的子集,但你會扔掉很多去做。在兩個平臺上。

ES 2.x與桌面GL 2.1有着更多的相似之處,但它仍然不是一個合適的子集。例如glTexImage2D具有完全不同的行爲。在桌面GL下,最後三個參數不會影響紋理的實際格式。在ES 2.0下,它們是定義紋理的實際圖像格式。您可以編寫一個有效的glTexImage2D命令,它可以在ES 2.0和桌面版GL 2.1下執行相同的操作,但是您要在桌面GL上做很多工作(例如選擇大小適中的內部格式)。

這就是說,你通常可以通過抽象來封閉API差異。您將要使用ES 2.0遇到的最大問題是GLSL。

GLSL ES添加了幾個新關鍵字,特別是精度限定符。桌面GLSL 1.20(與GL 2.1配對)沒有這些關鍵字。桌面GLSL 1.30和更高版本,但這些都綁定到GL 3.0 硬件。所以很難爲ES 2.0編寫一個着色器,它將在桌面GL 2.1硬件上不加修改地運行。

這不是不可克服的,當然。一些明智的#define,它們本身可以被#ifdef'd用於不同的語言,可以使這非常簡單。但是你仍然必須找到所有這些情況。

最近發佈的OpenGL ES 3.0沒有3.3的OpenGL的適當子集或者,但它不是ES 2.0接近。真正重要的是GLSL 3.30幾乎與GLSL ES 3.00相同。所以你可以更容易地在兩者之間交換着色器。

有在ES 3.0一定限度不在3.3,但一般這些都是容易避免(和使用其中大部分是不好的做法反正)。而一些的ES 3.0的功能在技術上並非在GL 3.3,但他們在現有普通核心擴展GL 3.3(如ARB_texture_storage,而且也將ES3_compatibility擴展,以增加兼容性)。但現在處理起來要容易得多,glTexImage2D實際上在兩種情況下的工作方式相同。現在,interop更多的是避免兩者都不可用的功能。

4

當前版本的OpenGL(4.x)和OpenGL ES(2.x)是相似的,雖然有足夠的差異,移植代碼不會僅僅通過重新編譯工作。正如@Nicol Bolas指出的那樣,OpenGL中有許多功能在OpenGL ES中都不存在,而一些API的行爲則略有不同。而且,平臺支持是非常不同的(即設置渲染上下文等)。

OpenGL ES 2.0實際上並不向後兼容1.x,因爲模型已從舊的直接模式樣式(如OpenGL 2.1及更早版本中所述)更改爲更現代的基於着色器的模型。

OpenGL v3和v4棄用了許多不合時宜的2.x功能,儘管主要驅動程序保留了兼容模式以繼續此較舊的支持。

OpenGL 4.x中的GL_ARB_ES2_compatibility extension有助於將桌面版和移動版更緊密地結合在一起,以減輕可移植性。

glOrtho VS glOrthof細微的差別顯然是易於管理,但你需要編寫其他功能的包裝。

+0

「的OpenGL(4.x版)和OpenGL ES(2.X)的當前版本非常相似,並且在很大程度上兼容」當然他們。如果您實際上沒有*使用任何2.1版功能。像整數紋理,統一的緩衝對象,separate_shader_objects,高級着色器(幾何形狀和曲面細分),我可以繼續下去,但我的觀點是明確的。只有當你癱瘓你的桌面GL代碼時,它們纔會相似。 – 2012-04-27 07:13:18

+2

感謝您的糾正。我相應地更新了上述內容,所以我希望現在就是這樣。我也贊同你的回答。 – gavinb 2012-04-28 02:16:59