簡體   English   中英

OpenGL ES 2 / iOS GLKit的設計建議

[英]Design advice for OpenGL ES 2 / iOS GLKit

我想使用新的GLKit框架構建應用程序,並且需要一些設計建議。 我想創建一個可顯示多達數千個“磚”(具有非常簡單的幾何體的對象)的應用。 大多數將具有相同的紋理,但多達數百個將具有獨特的紋理。 我希望磚塊每隔幾秒鍾出現一次,移動到位,然后保持原狀(以世界坐標顯示)。 我想模擬一個相機,其位置和方向由用戶手勢控制。

我需要的建議是關於如何組織代碼。 我希望我的模型是一組磚塊,這些磚塊具有比與它們關聯的圖形數據更多的功能:

  • 將類似視圖的對象與每個手柄的幾何形狀,紋理等相關聯是否有意義?
  • 每個積木都應該有自己的頂點緩沖區嗎?
  • 每個人都應該擁有自己的GLKBaseEffect嗎?
  • 我正在尋找幫助來組織什么對象在設置過程中應該做什么,然后進行渲染。

我希望我可以通過使用GLKViewController觀察模型狀態變化,基於手勢控制眼睛坐標等來保持接近典型的MVC模式。

如果您能提供一些建議或引導我尋求一個好的榜樣,那將是非常有義務的。 提前致謝!

關於模型,我認為類似於UIImageUIImageView之間的關系的方法是合適的。 因此,每種類型的積木都具有單個頂點緩沖區GLKBaseEffect ,紋理以及其他任何東西。 然后,每個積木可能會出現多次,就像多個UIImageViews使用同一UIImage 就保留多個參考框架而言,構建一個基本上等效於UIView的層次結構實際上是一個好主意,每個層次結構都包含相對於父UIView的某種轉換以及一種能夠顯示模型的轉換。

從GLKit文檔中,我認為保持所需攝像頭(以及對象位置)的最佳方法是將其直接存儲為GLKMatrix4GLKQuaternion因此,您無需派生矩陣或四元數(加上位置) )從攝像機的其他描述中得出,而是矩陣或四元數直接作為攝像機的存儲空間。

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

用這種方式處理相機時,我能想到的唯一一點不太明顯的事情就是您想將反函數發送給OpenGL,而不是事物本身。 假設您使用矩陣,則理由是,如果要在該位置繪制對象,則直接加載矩陣,然后繪制該對象。 當您在與相機相同的位置繪制對象時,您希望它最終在原點被繪制。 因此,您必須為攝像機加載的矩陣是要加載在該位置繪制的矩陣的逆矩陣,因為您希望將兩者相乘才能成為單位矩陣。

我不確定您的積木模型有多復雜,但是如果它們簡單且全部完全獨立地移動,則可能會遇到性能瓶頸。 處理OpenGL的一般規則是,一次可以提交的幾何圖形越多,一切進行得越快。 因此,例如,與大多數游戲可以獨立移動的世界相比,像大多數游戲中那樣的完全靜態世界更容易有效繪制。 如果要繪制六面立方體並單獨移動它們,則性能可能會比預期的差。

如果您有任何一起移動的磚塊,則將它們繪制為單個幾何體會更有效。 如果您有任何絕對看不見的磚塊,那就不要嘗試繪制它們。 從iOS 5開始, GL_EXT_occlusion_query_boolean可用,這是將某些幾何圖形傳遞給OpenGL並詢問是否可見的一種方法。 您可以在實時場景中使用它,方法是構建描述數據的層次結構(如果您直接遵循UIView類比,則已經具有該結構),為每個視圖計算或存儲一些邊界幾何,並且僅當遮擋時才進行繪制查詢表明至少某些邊界幾何是可見的。 通過遵循這種邏輯,您經常可以在提交幾何圖形之前就丟棄大量幾何圖形。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM