OpenGl: проблема с производительностью анимации MD2 - PullRequest
1 голос
/ 10 апреля 2011

У меня проблема (просто плохой код) с моей функцией renderMd2.

Он просто рисует каждую вершину модели (сохраненную в floatarrays) с

 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,852 мс до 2,128 мс только с одной моделью ...

Любые учебные пособия или предложения по повышению производительности (я слышал о списках отображения, но я думаю, что они предназначены только для статики)

Ответы [ 2 ]

3 голосов
/ 10 апреля 2011

Вы имеете в виду «статичный» в неанимационном смысле?Нет.

GL "Списки отображения" следует избегать;они заменяются объектами вершинного буфера , которые подходят для рисования кадров анимации MD2.

Поместите все свои кадры MD2 в GL_STATIC_DRAW VBO и просто нарисуйте соответствующий VBO каждый кадр.

Более того, MD2 может даже интерполировать в вершинном шейдере, делая плавную анимацию при невероятно быстрой скорости.

Есть код, который делает это здесь и соответствующий шейдер здесь .

Вопрос об этом на gamedev.stackoverflow.com

0 голосов
/ 10 апреля 2011

Список отображения не только для "статического материала". Полезны и могут ускорить ваш код. Используй это. Довольно маловероятно достичь целей производительности при рендеринге сеток без списка отображения. Определив список отображения, вы всегда можете выполнить свои преобразования, вызывая связанную матрицу, прежде чем вызывать список отображения.

Кроме того, поместите все возможные вычисления за пределы (до) вызовов glBegin / glEnd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...