2010-09-10 4 views
1

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

... 
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); 
... 

рендер() заключается в следующем:

void CBox::render() 
{ 

    glPushMatrix(); 
    glTranslatef(center.x,center.y,center.z); 

    glDrawArrays(GL_QUADS, 0, 24); 
    glPopMatrix(); 
} 

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

+0

Строго фиксированная функция, или вы можете поддерживать шейдеры? – genpfault

+0

Я не очень хорошо разбираюсь во всей работе с шейдером – jmasterx

ответ

0

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

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

0

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

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-разрядные поплавки (в большинстве реализаций), это, вероятно, лучше всего использовать двойной точности с плавающей точки, чтобы сохранить смещение, чтобы уменьшить накопление ошибок округления.

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

+0

Хорошо, это немного помогло, но что еще мне теперь делать? – jmasterx

+0

Сколько ящиков вы оказываете? Еще несколько идей: 1) Используйте треугольные полосы вместо квадрациклов (быстрый «треугольник с полосой треугольника», Google покажет вам, как), и/или 2) используйте список отображения – Gretchen

0

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

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

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

Смежные вопросы