2010-01-10 21 views
3

我工作的一個iPhone OS的應用程序,其主要觀點是OpenGL的2D視圖(這是蘋果EAGLView類的子類,基本上建立一個鄰投射二維環境),用戶直接交互。在iPhone上使用OpenGL的分層2D應用最有效的「體系結構」?

有時候(未在任何時候)我想使這個基線GL基礎上增加一些控制view--認爲像擡頭顯示。請注意,下面的基準視圖可能是滾動/動畫,而控件應該似乎固定在上面的屏幕上。我非常喜歡Cocoa視圖,而且我對CoreGraphics很滿意,但是我對Open GL表示很滿意,而且EAGLView的操作(以及它與CALayers的關係)對我來說是相當不透明的。我不知道如何最有效地混合其他元素(閱讀:最佳性能,最少麻煩等)。我知道,在一個小問題中,我可以創建並保留所有其他控件的幾何圖形,並在每次繪製/交換時將它們渲染到基線幾何圖形的頂部,從而只保留用戶在單個視圖中看到的所有內容。但我不太確定其他技術,比如在頂部有另一個視圖(UIKit/CG或GL?)或以某種方式在我的單視圖中創建其他圖層等。

如果人們會如此友善地寫出來一些簡短的觀察,如果他們以前走過這些道路,或至少指向我的文件或關於這個問題的現有討論,我將不勝感激。

謝謝。

回答

3

照常創建動畫視圖。將其渲染到渲染目標。這是什麼意思?那麼,通常,當您將多邊形「繪製」到屏幕上時,實際上是將其繪製到一個普通表面(主表面)上,而這恰好是最終進入屏幕的那個表面。您可以渲染到任何舊的表面,而不是渲染到屏幕表面。

現在,您的HUD。這會一直是完全一樣還是會改變?只有部分會改變嗎?

如果所有它的變化,你需要讓所有的HUD幾何形狀和紋理內存,並且必須使它們在你的「滾動」面是正常的。你可以將這個最終的複合渲染應用到屏幕上。我不會過分擔心這裏的麻煩和表現 - 平視顯示器幾乎不像背景那麼複雜。最多隻有幾個紋理四邊形?

如果所有的HUD的是靜態的,那麼您可以在您的應用程序啓動時渲染到單獨的表面,然後每一幀從表面呈現到動畫面,你正在繪製每一幀。這樣,您就可以在開始時卸載所有HUD幾何圖形和紋理。當然,情況可能是表面佔用更多內存 - 這取決於您的應用程序最需要的資源。

如果你有一半的變化,一半不變,那麼在技術上,你可以預先渲染靜態部分,然後渲染其他部分,但這比其他兩個選項更麻煩。

您的兩個主要選項取決於HUD的動態性。如果它移動,你需要每幀重新繪製到你的場景中。它很糟糕,但我幾乎無法想象幾何比其他部分複雜。如果它是靜態的,您可以在發送到屏幕之前進行預先渲染並將alpha表面混合到另一個表面。

正如我所說,這一切都取決於你的應用程序將有多少資源。

+0

感謝您的回答,Pod。我猜你在說什麼是「不要在GL視圖的頂部繪製控件或CoreGraphics的任何東西」。以下是後續步驟:當我渲染到另一個(而不是屏幕)表面時,我如何在主表面頂部進行拍攝? – 2010-01-13 06:12:23

+0

我很久沒有使用OGL了,但我很簡單(如果不是''的方式),只是繪製一個與目標表面大小相同的四邊形,並將預渲染的東西用作紋理。如果它們尺寸不同,這也會爲您調整。如果他們是1:1,那麼它基本上是一個老式的blit。使用阿爾法混合等來獲得期望的結果時,繪製HUD(所以你不要只使用HUD白色屏幕,等:)) – Pod 2010-01-13 10:57:03

+0

另外,當做一個預渲染的四個「blit」到你的屏幕上,可能最容易使用「直通」VS.我認爲OGL有一個功能可以爲你做到這一點,但如果沒有,只需製作GLSL着色器,而不是簡單地傳遞xyzw和uvst而不改變它們,並使用座標(1,0,0,0),(0,0 ,0,0),(1,1,0,0)等四個角落。您可能需要使用z來使其顯示已經在該渲染目標上的像素的「infront」。 – Pod 2010-01-13 11:23:11