2012-03-09 105 views
11

從我看過的文章看來,OpenGL ES 2.0不是什麼像OpenGL 2.1,這是我之前的設想。OpenGL ES 2.0 vs OpenGL 3 - 異同點

我很想知道的是,OpenGL 3是否與OpenGL ES 2.0相差無幾。換句話說,鑑於我即將爲桌面和Android製作遊戲引擎,在OpenGL 3.x +和OpenGL ES 2.0方面,我是否應該注意到有什麼區別?

這也可以包括OpenGL 4.x版本。

例如,如果我開始閱讀this的書,我在浪費我的時間,如果我打算端口發動機的Android(當然使用NDK;))?

回答

20

從我讀過的東西,看來OpenGL ES 2.0的不一樣的OpenGL 2.1,這是我從以前假設任何事情。

定義「是什麼都沒有」。桌面GL 2.1有一些ES 2.0沒有的功能。但是,這兩者中的一個最常見的子集可以在兩者上工作(儘管您必須爲紋理圖像加載進行模糊處理,因爲這裏存在一些顯着差異)。

桌面GL 3.x提供了許多未擴展ES 2.0的功能。 Framebuffer對象是3.x中的核心,而它們是2.0中的擴展(即使這樣,只有一個目標圖像沒有另一個擴展名)。有變換反饋,整數紋理,統一緩衝區對象和幾何着色器。這些都是特定的硬件功能,要麼在ES 2.0中不可用,要麼只能通過擴展使用。其中一些可能是平臺特定的。

但是在桌面GL 3.x上也有一些很好的API便利功能。明確屬性的位置(layout(location=#)),VAOs等

例如,如果我開始讀這本書,我在浪費我的時間,如果我打算端口(當然使用NDK)發動機到Android)?

這取決於你打算做多少工作,以及你準備做什麼使其工作。至少,您應該瞭解OpenGL ES 2.0的功能,以便了解它與桌面GL的不同之處。

很容易避免實際的硬件功能。渲染到紋理(或多個紋理)是您的算法所要求的。正如變換反饋,幾何着色器等一樣。所以你需要多少取決於你想要做什麼,並且根據算法可能有替代方案。

您更可能被抓到的東西是便利桌面GL 3.x的功能。例如:

layout(location = 0) in vec4 position; 

這在ES 2.0中是不可能的。類似的定義是:

attribute vec4 position; 

這將工作在ES 2.0,但它不原因position屬性要與屬性索引0相關聯。這必須通過代碼完成,在程序鏈接之前使用glBindAttribLocation。 Desktop GL也允許這樣做,但您鏈接的書不會這樣做。出於顯而易見的原因(這是一本基於3.3的書,並沒有試圖保持與舊的GL版本的兼容性)。

統一緩衝區是另一個。本書使自由使用它們,特別是對於共享透視矩陣。這是一個簡單而有效的技術。但是ES 2.0沒有這個功能,它只有每個節目的制服。

同樣,如果你喜歡,你可以編碼到公共子集。也就是說,您可以故意放棄使用明確的屬性位置,統一緩衝區,頂點數組對象等。但是這本書並不能幫助你做到這一點。

這會浪費你的時間嗎?那麼,這本書不是教你OpenGL 3.3 API(它確實這樣做,但那不是重點)。這本書教你圖形編程;它恰好使用3.3 API。您在那裏學到的技能(除了那些基於硬件的技能)將轉移到您使用的涉及着色器的任何API或系統。

這樣說:如果您不太瞭解圖形編程,那麼使用什麼API學習並不重要。一旦你掌握了這些概念,你可以閱讀各種文檔,並理解如何將這些概念很容易地應用於任何新的API。

+0

完美 - 正是我需要的。謝謝。 :) – zeboidlund 2012-03-09 08:44:22

+0

佈局限定符實際上在ES 2.0中可用。你需要在你的GLSL中指定「#extension GL_EXT_separate_shader_objects:enable」,你仍然使用「attribute」而不是「in」。 – 2012-11-08 15:31:36

+1

@NicolBolas不正確。該規範明確指出「也適用於ARB_explicit_attrib_location功能」 – Speed 2013-08-11 12:28:30

1

OpenGL ES 2.0(和3.0)主要是桌面OpenGL的子集。

最大的區別是ES中沒有傳統的固定功能管道。什麼是固定功能管道?有任何使用任何訪問像gl_Vertex固定功能數據的變量,gl_Normalgl_Colorgl_MultiTexCoordgl_FogCoordgl_ModelViewMatrix和做與glVertexglColorglNormalglLightglPushMatrixglPopMatrixglMatrixMode,等等...在GLSL來自固定功能流水線的各種其他矩陣。

如果您使用這些功能中的任何一項,您將會爲您剪切一些工作。 OpenGL ES 2.0和3.0只是普通的着色器。沒有「3d」爲您提供。您需要自己編寫所有投影,光照,紋理參考等。

如果你已經這麼做了(大多數現代遊戲可能都這樣做),你可能沒有太多的工作。另一方面,如果您一直在使用那些從我的經驗中不常用的OpenGL特性,那麼這些特性仍然非常常見(大多數教程仍然使用這些特性)。然後,當您嘗試自行重現這些功能時,您已經完成了一些工作。

有一個開源庫,regal,我認爲這是由NVidia啓動的。它應該重現那些東西。請注意,整個固定功能系統的效率相當低,這是它被棄用的原因之一,但它可能是一種快速運行的方式。