簡體   English   中英

Skybox OpenGL ES iPhone和iPad

[英]Skybox OpenGL ES iPhone and iPad

我需要為iOS創建一個虛擬游覽工具。 這是一個考古應用:用戶可以在他在一座歷史建築內或在他參觀考古挖掘時打開它。 不需要像厄運一樣的主觀觀點:只是一個天空盒。 該應用程序將有一個興趣點(POI)列表。 每個POI都有自己的天空盒。

我認為我可以使用OpenGL-ES創建一種可以通過觸摸驅動/旋轉的紋理天空盒。 紋理是高分辨率的PNG照片。

這是一個資助項目,我有4個月。

我該去哪里學習如何開發它? 我必須購買一本書嗎? 哪一個?

我只有適度的Objectve-C和Cocoa-touch技能,因為我只為iPad構建了一個應用程序。 我對OpenGL-ES一無所知。

由於我非常了解OpenGL ES,所以我參加了一個演示項目,完成了你所描述的大部分內容。 具體的意圖是只要性能足夠好,就可以在OpenGL ES下以最簡單的方式完成所有工作。

從Apple提供的OpenGL模板開始,我編寫了一個新類,其中包含一個評論很多的實現文件,長度為122行,可以將PNG圖像作為紋理加載。 我已經修改了示例視圖控制器以根據需要繪制天空盒,並使用正常的iPhone慣性滾動版本來響應觸摸,這意味着編寫少於200行(也已注釋)的代碼。

要實現這一點,我需要知道:

  • CoreGraphics意味着從PNG獲取像素數據
  • 如何設置PROJECTION堆棧以獲得具有正確寬高比的透視投影
  • 如何根據成員變量操縱MODELVIEW堆棧以確保場景的雙軸旋轉(第一人稱射擊游戲或Google街景風格),並確保我定義的立方體幾何體與近剪裁平面不明顯相交
  • 如何為OpenGL指定頂點位置和紋理坐標
  • 如何指定三角形OpenGL應該在頂點之間構造
  • 如何相應地設置OpenGL紋理參數以僅為紋理提供一個細節級別
  • 如何跟蹤觸摸來操縱指示旋轉的成員變量,包括一些慣性旋轉的機制

當然,遵守普通視圖控制器生命周期指令。 紋理在viewDidLoad上加載並在viewDidUnload上釋放,例如,以確保此視圖控制器可以很好地處理潛在的內存警告。

主要觀察結果是,除了了解Objective-C信號機制之外,大部分都是C的東西。 您主要使用C數組和引用來為OpenGL和CoreGraphics進行C函數調用。 因此,自己編碼的先決條件是在C中感到高興,而不僅僅是Objective-C。

CoreGraphics的東西有點單調乏味,但它只是閱讀文檔來弄清楚每種類型的東西與下一種東西的關系 - 沒有一個真的令人困惑。 只需了解您需要PNG數據的數據提供者,您可以從該數據提供者創建一個圖像,然后創建一個具有您自己分配的內存的位圖上下文,將圖像繪制到上下文中然后釋放所有內容除了你自己分配的結果留給結果。 該結果可以直接上傳到OpenGL。 這是一個相對較短的樣板文件,但OpenGL沒有PNG的概念,而CoreGraphics沒有方便的方法將內容推入OpenGL。

我假設紋理在磁盤上是合適的大小。 出於實際目的,這意味着假設它們在每個邊緣都是一個2的冪。 我的是512x512。

OpenGL紋理管理很容易; 它只是閱讀手冊來了解紋理名稱,名稱分配,紋理參數和上傳圖像數據。 更常見的事情更多的是了解正確的功能而不是管理直觀的飛躍。

為了向OpenGL提供幾何,我只是完整地寫出了數組。 我想你需要一點空間思維才能做到這一點,但在紙上畫出一個三維立方體並對角落進行編號將是一個很大的幫助。 有三個相關的數組:

  • 頂點位置
  • 與每個頂點位置一起的紋理坐標
  • 引用定義幾何的頂點位置的索引列表

在我的代碼中,我使用了24個頂點,將立方體的每個面視為邏輯上離散的東西(因此,六個面,每個面都有四個頂點)。 為簡單起見,我僅使用三角形定義了幾何體。 當你開始時,將這些東西提供給OpenGL實際上非常煩人; 發生錯誤通常意味着你的程序在OpenGL驅動程序內部崩潰,而不會給你一個關於你做錯了什么的提示。 最好一次建立一點。

對於能夠托管OpenGL內容的UIView而言,我或多或少地使用了Apple在OpenGL模板中直接提供的vanilla。 我做的一個更改是明確禁用任何嘗試使用OpenGL ES 2.x. 1.x對於這項任務來說已經足夠了,所以我們首先通過不提供兩個備選渲染路徑來獲得簡單性,其次因為ES 2.x路徑會更加復雜。 ES 2.x是具有像素和頂點着色器的完全可編程管道,但在ES域中,固定管道被完全移除。 因此,如果你想要一個,那么你必須為普通的矩陣堆棧提供自己的替代品,你必須編寫頂點和片段着色器來做'帶紋理的三角形'等。

觸摸跟蹤並不是特別復雜,或多或少只需要我了解視錐體如何工作以及如何在Cocoa Touch中提供觸摸。 一旦你完成了其他所有事情,這一點應該很容易。

值得注意的是,我必須實現的數學非常簡單。 只是觸摸跟蹤,真的。 假設您想要一個谷歌地圖類型的視圖意味着我可以完全依賴OpenGL的內置旋轉功能。 在任何時候我都沒有明確處理矩陣。

因此,你需要多長時間才能寫出來取決於你對C和CoreGraphics的信心,以及你有時在黑暗中編碼的快樂程度。 因為我知道我在做什么,整個過程需要兩三個小時。

我會嘗試找到上傳項目的地方,以便您可以查看它。 我認為翻閱它並看看它看起來多么陌生是有幫助的。 這可能會讓您對在項目的時間范圍內是否能夠實現滿足所有需求的內容有所了解。

我已經將視圖控制器保留為只有一個視圖,這是OpenGL視圖。 但是,正常的iPhone合成規則適用,在您的項目中,您可以輕松地將常規控件置於頂部。 你可以在mediafire上抓住我的小實現。 StackOverflow帖子長度限制阻止我在這里放大代碼片段,但請隨時詢問您是否有任何具體問題。

如果你從頭開始學習OpenGL ES,那將是非常艱難的。 我會使用圖形引擎來完成大部分繁重的工作。 我正在玩Ogre3d,從我到目前為止看到的我可以推薦它: http ://www.ogre3d.org/。 它開箱即用Skybox(以及更多),應該非常直接。

我想你可以這樣做,這里有一些幫助你入門的鏈接:

http://sidvind.com/wiki/Skybox_tutorial

常見問題:

(我會發布直接鏈接但stackoverflow不會讓我)

查看stackoverflow項目號2859722和2297564。

一些幫助制作紋理的程序和技巧:

spacescape

這里有一些很棒的opengl教程:

nehe.gamedev.net

它們不是特定於iPhone的,但是它們很好地解釋了opengl。 我想有些人也將這些移植到手機上,我現在無法找到它們。

暫無
暫無

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

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