2011-04-10 55 views
1

我的renderMd2函數出現問題(只是不好的代碼)。OpenGl:MD2動畫性能問題

它只是繪製與

glBegin(GL_TRIANGLES); 
for(i = 0; i < numTriangles; i++) 
{ 
     CalculateNormal(vList[triIndex[i].meshIndex[0]].point, 
      vList[triIndex[i].meshIndex[2]].point, 
      vList[triIndex[i].meshIndex[1]].point); 

    if (modelTex != NULL) 
     glTexCoord2f(st[triIndex[i].stIndex[0]].s, 
      st[triIndex[i].stIndex[0]].t); 

     glVertex3fv(vList[triIndex[i].meshIndex[0]].point); 

    if (modelTex != NULL) 
     glTexCoord2f(st[triIndex[i].stIndex[2]].s , 
      st[triIndex[i].stIndex[2]].t); 

     glVertex3fv(vList[triIndex[i].meshIndex[2]].point); 

    if (modelTex != NULL) 
     glTexCoord2f(st[triIndex[i].stIndex[1]].s, 
      st[triIndex[i].stIndex[1]].t); 

     glVertex3fv(vList[triIndex[i].meshIndex[1]].point); 
} 
glEnd(); 

幀時間從1.852ms增加只用一個模型來2.128ms模型(保存在floatarrays)的每個頂點......

任何教程或建議以提高性能(我聽說過顯示列表,但我認爲它們只是用於靜態的東西)

回答

0

顯示列表不僅僅是用於「靜態東西」。是有用的,可以加快你的代碼。用它。 在渲染沒有顯示列表的網格中實現性能目標是非常不可能的。 一旦你定義了一個顯示列表,你可以在調用顯示列表之前始終執行調用相關矩陣的轉換。

另外把所有可能的計算之外(之前)glBegin/glEnd調用。

+0

這個問題的一個問題是,我有以計算第一頂點的每幀 – 2011-04-10 20:02:40

+0

@Alex克魯格:正常的三角形保持相同。加載網格時只需計算它 – Heisenbug 2011-04-10 20:06:22

3

你的意思是'靜態'在非動畫意義上?不。

GL「顯示列表」應避免;它們被替代爲Vertex Buffer Objects,它們適合繪製MD2動畫幀。

將所有MD2幀放入GL_STATIC_DRAW VBO中,並簡單地在每一幀中繪製適當的VBO。

Furhermore,MD2甚至可以在頂點着色器插,使平滑的動畫同時又是極快的。

有這樣的代碼here和相應的着色器here

瞭解這個上gamedev.stackoverflow.com