2013-10-09 62 views
1

這是兩個問題,涉及同一主題。交錯索引緩衝區可以用於骨骼動畫,算法是否可以優化?

我最近做了一個obj加載器,它從obj數據創建一個交織的索引緩衝區。它工作正常,但對於大型模型,由於此緩衝區格式的關鍵部分是加載單個網格,所以可能需要幾分鐘的時間;非唯一索引可以在索引數組中引用多次,因此不需要兩次添加相同的索引數據。問題是,要測試一個索引是否是唯一索引涉及對其他索引數據進行測試,並且對於大文件,這可能需要幾分鐘才能計算。有沒有辦法加快這一點?我應該跳過唯一索引檢查嗎?或者我應該使用此代碼並使用它創建基於obj的自己的文件,以便將數據直接轉儲到程序中?

未來我想在我的程序中調整一個動畫元素(使用庫導入collada數據),儘管我無法在動畫網格中找到頭部,但始終我相信基於n個權重,一個頂點在頂點着色器中被操縱,所以我們不能告訴每個索引哪些骨骼受到它的影響,並在着色器中更新它?或者我誤解了這個過程?

回答

0

如果你確定減速是唯一的索引檢查,我建議你將預處理代碼寫成二進制數據到你加載的文件而不是OBJ文件 - 你可以將預處理代碼複製粘貼到命令行工具中,將結果文件放入項目中,然後使用NSData獲取其內容並將VBO設置爲數據。沒有代碼,很難說它的速度是否會加快 - 你如何執行檢查?你也許可以使用字典來獲得每次檢查的O(1)查找,或者如果幾何圖形真的很大,那麼多線程可能會有所幫助。

關於在着色器中如何通常實現骨架動畫,你是正確的。以下是我編寫的着色器中的一些代碼,可以幫助您。請注意,它僅支持16個骨骼,並且只有三個骨骼會影響每個點。

據我所知,網上最好的COLLADA動畫教程就是這個(http://www.wazim.com/Collada_Tutorial_1.htm),雖然作者的英文不是最好的,他的代碼是C++和C#。至於影響,你可能會創建一個頂點屬性並將其添加到交織後的VBO中。

uniform mat4 modelViewProjectionMatrix; 
attribute vec3 boneWeights; 
attribute vec4 position 

void main() 
{ 

vec4 animatedPosition; 
animatedPosition = ((position * boneMatrices[int(boneIndex[0])])) * boneWeights[0]; 
animatedPosition += ((position * boneMatrices[int(boneIndex[1])])) * boneWeights[1]; 
animatedPosition += ((position * boneMatrices[int(boneIndex[2])])) * boneWeights[2]; 
gl_Position = modelViewProjectionMatrix * animatedPosition; 
} 
+0

抱歉,我認爲該代碼將是自explanitory http://pastebin.com/ffrmeF8K – user1828526

+0

玉以及我只是做了我的代碼假設所有的指標都是獨特的,它瞬間加載的東西。我已經決定爲了加快速度,我只會檢查當前一個索引後面的4個索引,因爲通常這些重複索引位於該空間內。 – user1828526