2012-03-20 31 views
0

我一直致力於通過引入批處理來改進我的OpenGL ES 2.0渲染性能;特別是創建一個RenderBatch,在創建時指定紋理和着色器(現在)。這將狀態設置爲VAO以允許便宜的狀態切換。我開始實行看起來像這樣:OpenGL批處理和實例唯一性

batch = RenderBatch.new "SpriteSheet" "FlatShader" 
batch.begin GL_TRIANGLE_STRIP 
batch.addGeometry Geometry.newFromFile "Billboard" 
batch.end 

batch.render renderEngine 

但隨後打我:我的廣告牌文件有是爲了進行縮放和轉換爲特定的實例使用頂點。所以我給addGeometry調用添加了一個轉換參數。

batch.addGeometry(Geometry.newFromFile("Billboard"), myObject.transform) 

這解決了縮放,平移,旋轉等的頂點的問題,但它通過第一查找所述頂點信息,通過變換矩陣變換它這樣做,然後將其插入到批量數據。雖然這工作似乎效率低下,這是CPU密集型的,並沒有利用GPU的轉換能力。然而,它有效,所以沒有那麼重要。 (很高興有更好的方法來做到這一點雖然)

但是,我遇到了一個障礙:紋理座標可能需要不同的每個實例,這意味着我將不得不通過一個紋理變換矩陣,現在這是感覺哈克。

是否有一種更簡單的方法來處理這種使用着色器對現有數據進行轉換的方法,該着色器不會限制給定的幾何/模型,並且可以輕鬆擴展以使用法線貼圖,UV貼圖和其他奇特技巧?謝謝!

回答

2

在我看來,你在說什麼是着色器uniforms。通常,您可以爲VBO和VAO中的每個批次設置頂點數據和屬性。然後,在渲染方法中,切換到正確的VAO並設置着色器制服。這些通常包括一個模型視圖投影矩陣,用於將頂點轉換爲剪輯空間,這必然會改變幾乎每一幀,使用正確的紋理等。

這是有效的,因爲不變的頂點數據保存在GPU內存中,VAO負責便宜的狀態切換,並且只有經常變化的制服纔會被髮送到每個渲染調用的GPU。

如果您在配料需要單獨模型視圖投影矩陣的多個對象,那麼你有幾種選擇:

  1. ,你必須執行單獨的平局呼籲,需要一個單獨的模型視圖投影每批矩陣

  2. 使用模型視圖投影矩陣的陣列作爲均勻並具有用於提供正確的投影矩陣索引中的每個對象中的屬性來使用

  3. 您必須使用CPU轉換頂點並用更新後的數據填充VBO

第一種方法是首選解決方案,它將高效而簡單。渲染大量繪製調用的緩慢部分通常是從CPU獲取數據到GPU,如果您已經擁有VBO中的頂點數據,那麼每個對象的繪製調用的開銷不會太大。這也解決了如何基於對象屬性爲每個對象提供不同的制服的問題。在每個對象渲染方法中,在繪製調用之前將相關屬性設置爲制服。如果每個對象都需要將不同的數據發送到GPU,那麼該如何工作?

+0

這都有道理,但我不相信它解決我遇到的問題。 ModelViewProjection制服做工精良的整個場景變換(攝像頭),但每個對象都有自己的變換,以及,它修改WHERE場景模型應繪製。但是,我想避免轉換CPU上的座標並將轉換留在GPU上。另外,我需要一種基於各個對象屬性修改對象(特別是紋理座標和顏色)的方法。 – Grimless 2012-03-21 02:09:49

+0

增加了一些關於配料的事情,現在更清楚了嗎? – Tark 2012-03-21 10:14:38

1

這是一個折衷的局面。由於配料不足造成的狀態變化成本與CPU轉換成本相比較。沒有單一的最佳解決方案,但它取決於你的場景有多少是靜態的,有多少是動態的以及它是如何佈置的。

一個常見的解決方案是把靜態對象,其轉化相對於彼此從未改變成一個單一的VBO,或少數維也納各組織(如果它們使用不同的紋理,頂點格式等),完全轉化。這在渲染之前完成一次。不是每一幀。動態對象(玩家,怪獸,其他)然後單獨渲染,在頂點着色器中完成變換。

您仍然可以通過粗略訂購單個對象的質地和方案圖紙優化狀態變化。

+0

好了,你說這種配料是一種固有的困難和/或低效的過程。有沒有簡單的解決方案讓單獨的幾何體能夠按照對象狀態進行轉換(例如動畫轉換,顏色更改,紋理佈局更改等)希望VBOs和VAO會限制每個對象的數據量,以便每個對象繪圖足夠快......謝謝! – Grimless 2012-03-21 17:23:04