2011-10-29 53 views
2

我想使用新的GLKit框架構建應用程序,並且需要一些設計建議。我想創建一個應用程序,可以顯示幾千個「磚塊」(幾何體非常簡單的對象)。大多數將具有相同的紋理,但高達幾百個將具有獨特的紋理。我希望磚塊每隔幾秒鐘出現一次,移到原地,然後保持放置(在世界座標中)。我想模擬一個位置和方向受用戶手勢控制的相機。OpenGL ES 2/iOS的設計建議GLKit

我需要的建議是關於如何組織代碼。我想我的模型是具有比與它們相關的圖形數據多了不少磚塊的集合:

  • 是否有意義的視圖類對象,每個手柄形狀,紋理等關聯?
  • 是否每塊磚都有自己的頂點緩衝區?
  • 每個人都應該擁有自己的GLKBaseEffect嗎?
  • 我正在尋找幫助,組織什麼對象應該在安裝過程中做什麼,然後渲染。

我希望我可以保持接近典型的MVC模式,使用我的GLKViewController觀察模型狀態變化,根據手勢控制眼圖座標等等。

如果您能提出一些建議或引導我走向一個好榜樣,那麼我們將非常感激。提前致謝!

回答

1

對於模型,我認爲類似於UIImageUIImageView之間的關係的方法是適當的。所以每種類型的磚都有一個頂點緩衝區,GLKBaseEffect,紋理和其他任何東西。然後每塊磚可能會出現多次,就像多個UIImageViews可能使用相同的UIImage一樣。就保留多個參考框架而言,建立一個實質上等價於UIView的層次結構實際上是一個非常好的主意,每個框架都包含一些相對於父代的變換,以及一種能夠顯示模型的變換。我認爲保持你想要的那種相機(甚至是物體位置)的最好方法就是直接將它存儲爲GLKMatrix4GLKQuaternion - 所以你不能派生矩陣或者四元數(加上位置)與相機的其他描述,而矩陣或四元數直接是相機的存儲。

這兩個類都有內置旋轉的方法,並且GLKMatrix4可以直接處理翻譯。因此,您可以直接將相關手勢映射到這些功能。

當我用這種方式處理相機時,我能想到的唯一稍微不明顯的事情是,您想要將發送給OpenGL,而不是本身。假設您使用矩陣,推理是如果您想要在該位置繪製對象,則可以直接加載矩陣,然後繪製該對象。當您在相同的位置繪製對象時,您希望它最終在原點處繪製。因此,您必須爲相機加載的矩陣是您在該位置繪製的矩陣的逆矩陣,因爲您希望這兩個矩陣乘以一起作爲單位矩陣。

我不確定你的磚模型有多複雜,但如果它們很簡單並且都完全獨立移動,你可能會遇到性能瓶頸。處理OpenGL的一般規則是,一次可以提交的幾何圖形越多,一切就越快。因此,例如,在大多數遊戲中,完全靜態的世界比一個可以獨立移動的世界更容易高效地繪製。如果您正在繪製六面立方體並將它們全部獨立移動,那麼您可能會看到性能比您預期的差。

如果您有任何磚塊一致移動,那麼將它們繪製爲單個幾何圖形會更有效。如果你有任何明顯不可見的磚,那麼甚至不要嘗試繪製它們。從iOS 5開始,可以使用GL_EXT_occlusion_query_boolean,這是一種將幾何幾何體傳遞給OpenGL並詢問是否可見的任何幾何體的方法。您可以通過構建一個描述數據的分層結構(如果您直接遵循UIView類比,那麼您將擁有該分層結構),計算或存儲每個視圖的某些邊界幾何並且僅在遮擋查詢表明至少有一些邊界幾何圖形是可見的。通過遵循這種邏輯,在提交之前很久就會丟棄幾何圖形的大部分幾何圖形。

+0

感謝您的好建議。按照你的建議,我將根據UIImageView的比喻重新審視它。到目前爲止,我做了幾個選擇:1)選擇將GL的東西與模型分開,2)由於磚可以共享幾何,所以將glGenBuffer和glBufferData放在類級別。 3)到目前爲止,我的工作是由視圖控制器擁有的單一基本效果,但作爲渲染參數傳遞,因爲vc迭代場景中的磚塊以調用每個渲染參數。在渲染中,磚複合材料是局部變形的,然後調用glDrawArrays。 – danh