2011-09-02 77 views
2

我想創建一個2d opengles引擎用於我的應用程序。這個引擎應該支持一個場景圖。根據其父節點,圖的每個節點都可以擁有自己的着色器,紋理,材質和變換矩陣。但我是opengles 2.0的新手,所以我有一些問題:opengles 2.0二維場景圖實現

  1. 矩陣乘法在opengles 2.0中如何工作?這是一個很好的方法來繪製第一個父母,然後它是子節點(當模型視圖矩陣相乘時它會提供一些優化)。矩陣乘法在哪裏發生?我應該在CPU上還是在GPU上執行它。
  2. 根據它使用的着色器繪製節點,然後繪製紋理和材質,是更好的方法嗎?在這種情況下,我應該如何實現場景圖轉換(在CPU或GPU上以及如何)?

回答

4

矩陣乘法在opengles 2.0中如何工作?這是一個很好的方法來繪製第一個父母,然後它是子節點(當模型視圖矩陣相乘時它會提供一些優化)。矩陣乘法在哪裏發生?我應該在CPU上還是在GPU上執行它。

除了一些古老的SGI機器,變換矩陣乘法總是發生在CPU上。雖然可以在着色器中進行矩陣乘法,但不應該用於實現變換層次。你應該使用或者實現一個小的線性代數庫。如果它是針對4x4均勻轉換而定製的,那些用於3D圖形的轉換,它可以在1k行以下的C代碼中實現。

對於轉換堆棧中的每個級別,您都可以創建當前矩陣的副本,對其應用下一個轉換並提供新的值,而不是依賴於舊版OpenGL矩陣堆棧(已棄用並從更高版本中刪除)矩陣到變換統一。

根據它使用的着色器,然後紋理和材質繪製節點是一個更好的方法嗎?在這種情況下,我應該如何實現場景圖轉換(在CPU或GPU上以及如何)?

通常人們使用兩階段方法來渲染。在第一階段中,您將收集有關要繪製哪些對象以及繪圖輸入數據(着色器,紋理,轉換矩陣)的所有信息並將其放入列表中。然後根據一些標準對該列表進行分類。人們想要最小化狀態變化的總成本。

最昂貴的狀態改變是切換紋理,因爲這會使緩存失效。在紋理單元之間交換紋理有一定的成本,但是它比切換着色器還要便宜,這會使執行路徑預測器的狀態無效。然而,改變統一的數據非常便宜,所以人們不應該急於經常換制服。所以如果你可以通過制服進行實質性的設置,就這樣做。但是,您必須瞭解,着色器中的條件代碼在其中具有性能,因此您必須平衡切換着色器的成本與條件着色器代碼的成本。

+0

非常感謝您的回答。您是否也可以回答這個問題:實際上,所有事情都在2D中進行,而場景圖也定義了節點的zOrder。所以這個順序在渲染時必須保持。在啓用GL_DEPTH_TEST的情況下使用z值(如0.001或0.01)來優化渲染順序是個好主意嗎?否則,我將不得不使用zOrder的第一個排序標準。也許你知道更好的方法?謝謝 – Andrew

+0

使用深度測試是一種有效的方法。其實我出於性能原因推薦它。使用PowerVR技術的OpenGL-ES設備實際上不使用深度測試(這是基於圖塊的深度排序渲染器),但是通過任何方式進行深度測試都可以減少透支。如果未啓用深度測試,則每個具有重疊基元的像素將被多次寫入。隨着深度測試,這個透支將會減少。理想情況下,您也可以將前後排序作爲次要排序(即在所有其他排序之後)以獲得最佳性能。 – datenwolf

+0

所以如此小的值不會在渲染時提供假象? – Andrew