2016-04-23 46 views
3

對於最新的Ludum Dare比賽,主題是變形,所以我的想法涉及從一個幾何形狀到另一個幾何形狀的簡單變形。如何使用着色器將一個3D對象變形爲另一個3D對象?

所以我做的是我在Blender中用相同的頂點數做了幾個對象。在OpenGL中,我爲每個對象製作了單獨的VAO,併爲「變形」對象製作了一個附加VAO(屬性爲動態繪製)。每一幀,當玩家變形時,我會將當前對象和目標對象之間的插值頂點數據上傳到這個額外的VAO中,然後渲染。否則,只需渲染對象的相應VAO。 變形方法是這樣的:

Morphing shapes

(頂點有不同的排序,因此變形不是「平滑」)

因爲我很少有時間我只是做了一些快速和骯髒的,但現在我認爲這不是一個很好的方法來完成這個過程,因爲我必須每幀都上傳大量數據到GPU。如果我想要在不同的變形階段繪製多個變形對象,它看起來也不可伸縮。

作爲改進此過程的第一步,我想將這些插值計算轉換爲着色器。 我或許可以將單個VAO中所有對象的數據存儲在單獨的屬性中,然後選擇要從中插入哪些屬性。

但我想知道:有沒有辦法以多種方式發送多個(兩個)對象/緩衝區到着色器,以及插值率統一,然後在着色器中我會進行插值?

+0

創建一個同時包含兩個對象的緩衝區 – teivaz

+0

@teivaz在我只有一個變形對象的情況下,這是一個好主意。但是如果我有多個物體,在最壞的情況下,我可能必須爲每種可能的組合創建多個VAO。 – aslg

+0

聽起來像管道鑲嵌部分的好工作。總有Compute着色器和CUDA/OpenCL interop用於不適合經典流水線的東西。 – Drop

回答

5

您可以創建一個緩衝區,爲每個頂點保存多個座標。就像通常你有座標,法線,紋理座標你可以有座標1,座標2,座標3等。然後在着色器中,你可以有一個統一的變量,說明使用哪一個。

有了兩個,它當然很容易,因爲統一將從零到一個,並且只需將第一個座標與它相乘,並添加第二個乘以(1.0 - 值)。

然後只要確保您從相同的基本形狀創建網格,他們將很好地變形。

此外,如果您使用法線,請確保您有幾個法線並在它們之間進行插值。

這裏減去的是,你通過着色器更多地跳過內存所需的數據越多,如果你有很多表單,它可能不是最漂亮的解決方案。

相關問題