Оптимизация этого алгоритма рендеринга OpenGL - PullRequest
1 голос
/ 10 сентября 2010

Моя игра рисует серию кубов из VBO и просто переводит в положение куба каждый раз:

...
SetCameraMatrix();
    SetFrustum();



    //start vbo rendering
    glEnableClientState(GL_VERTEX_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 1);

    glVertexPointer(3, GL_FLOAT, 0, 0);
    glColor3f(1,0.5,0);

    for(int i = 0; i < collids.size(); ++i)
{

            glColor3f(collids[i]->Color.x,collids[i]->Color.y,collids[i]->Color.z);
            collids[i]->render();   

}

//end vbo rendering
glDisableClientState(GL_VERTEX_ARRAY);  // disable vertex arrays
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
...

рендер () таков:Есть ли способ, которым я мог бы оптимизировать это?Поскольку я всегда рисую одно и то же, что я могу сделать, чтобы сделать этот процессор менее интенсивным?Спасибо

Ответы [ 3 ]

0 голосов
/ 11 сентября 2010

Вы можете испечь все свои кубики в одном VBO и нарисовать только этот (но геометрия действительно должна быть полностью статичной)

Вы можете использовать инстансинг

но с такой маленькой геометрией вы можете сделать немного больше.

0 голосов
/ 30 октября 2010

Если у вас много кубов, вашей большой проблемой будет количество вызовов на ничью. Видеокарты изливаются через треугольники с такой удивительной скоростью, что узким местом часто является водитель, делающий связь. В общем, чем меньше вы звоните, тем быстрее он будет идти.

Имея это в виду, вам будет намного удобнее разбрасывать все в один массив, даже если ваша геометрия динамична. Обновите геометрию для любых перемещенных кубов (все они при необходимости) и отправьте все это за один раз. Обновление геометрии с помощью VBO может быть немного сложным, на самом деле я не пробовал, но даже если вы просто использовали массивы вершин старой моды, это должно быть быстрее, чем ваша текущая настройка.

0 голосов
/ 10 сентября 2010

Есть много возможных оптимизаций.Я думаю, что один из них, который я бы использовал, - избегать толкания / расталкивания матрицы каждый раз, что может занять очень много времени.Поскольку вы только переводите, вы можете отслеживать ваш последний перевод и просто сдвигаться на относительную величину.В псевдокоде:

glPushMatrix()
Point3D offset(0,0,0)
for box in collids:
   glTranslatef(box.x + offset.x, box.y + offset.y, box.z + offset.z)
   draw_cube()
   offset -= (box + offset)
glPopMatrix()

Одно предупреждение: хотя OpenGL использует только 32-разрядные числа с плавающей запятой (в большинстве реализаций), вероятно, лучше использовать числа с плавающей запятой двойной точности для хранения смещения, чтобы уменьшить накопление округленияошибки.

(отредактировано для исправления вычисления смещения.)

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