2011-04-10 5 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

문제에 이것에 대해 질문 내가 정점 첫째 모든 프레임 –

+0

@ 알렉스 크루거을 계산해야한다는 것입니다. 메쉬를 로딩 할 때 그냥 계산해라. – Heisenbug

3

애니메이션이 아닌 의미에서 '정적'을 의미합니까? 아니.

GL "디스플레이 목록"은 피해야합니다. MD2 애니메이션 프레임을 그리는 데 적합한 Vertex Buffer Objects으로 대체됩니다.

모든 MD2 프레임을 GL_STATIC_DRAW VBO에 배치하고 각 프레임마다 적절한 VBO를 그립니다.

Furhermore는 MD2도 엄청나게 빠른되는 동안 부드러운 애니메이션을 제작, 버텍스 쉐이더에을 보간 할 수 있습니다.

here 코드와 해당 셰이더 here이 있습니다. 삼각형의 정상은 동일하게 유지 :

gamedev.stackoverflow.com