從我讀過的東西,看來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。
完美 - 正是我需要的。謝謝。 :) – zeboidlund 2012-03-09 08:44:22
佈局限定符實際上在ES 2.0中可用。你需要在你的GLSL中指定「#extension GL_EXT_separate_shader_objects:enable」,你仍然使用「attribute」而不是「in」。 – 2012-11-08 15:31:36
@NicolBolas不正確。該規範明確指出「也適用於ARB_explicit_attrib_location功能」 – Speed 2013-08-11 12:28:30