forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Тормоза opengl (http://forum.boolean.name/showthread.php?t=15997)

pozitiffcat 08.12.2011 17:31

Тормоза opengl
 
Например приложение работающее с одной моделью дает 200 FPS, с четырьмя такими же 90 ???
Рисую модели с помощью вызовов glTexCoord2f, glNormal3f, glVertex3f
Пробовал рисовать массивами glDrawElements, лучше не стало (( че за х, как оптимизировать?

HolyDel 08.12.2011 18:50

Ответ: Тормоза opengl
 
VBO.

moka 08.12.2011 19:54

Ответ: Тормоза opengl
 
HolyDel +1
Да и учитывай что падение с 100 на 75, не то же самое как с 75 на 50, хоть в кажом теряется 25 кадров, усилий же для падения с 75 на 50 нужно больше.
Короче говоря, степень снижения fps не линейна относительно нагрузке, а геометрически уменьшается.

.Squid 08.12.2011 20:08

Ответ: Тормоза opengl
 
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 777 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

pozitiffcat 08.12.2011 21:09

Ответ: Тормоза opengl
 
Цитата:

Сообщение от MoKa (Сообщение 213087)
HolyDel +1
Да и учитывай что падение с 100 на 75, не то же самое как с 75 на 50, хоть в кажом теряется 25 кадров, усилий же для падения с 75 на 50 нужно больше.
Короче говоря, степень снижения fps не линейна относительно нагрузке, а геометрически уменьшается.

вкурсе, но спасибо за подтверждение.

pozitiffcat 08.12.2011 21:48

Ответ: Тормоза opengl
 
Цитата:

Сообщение от HolyDel (Сообщение 213071)
VBO.

600 FPS ураааааааа, вот теперь можно и анимацию пилить

HolyDel 08.12.2011 23:27

Ответ: Тормоза opengl
 
нет. ты хочешь считать на ЦПУ. такчто тебе один фиг надо будет каждый раз заливать буфер в видеопамять.

pozitiffcat 08.12.2011 23:30

Ответ: Тормоза opengl
 
я уже попробовал (с симуляцией матричных преобразований, перемещал модель, на уровне точек), фпс не упал.
делал glBufferSubDataARB, (GL_STREAM_DRAW) вот у меня на работе карточка поддерживает не выше opengl 2.0, как мне заточить проект именно под эту версию. Пользуюсь расширениями glew

moka 09.12.2011 01:43

Ответ: Тормоза opengl
 
Шейдеры..

HolyDel 09.12.2011 01:48

Ответ: Тормоза opengl
 
фпс не упал по сравнению с чем? по сравнению с глбегин/гленд естественно не упадет. но ты еще не пробывал рассчитывать скин по костям на ГПУ. вот тут вбо поможет.

pozitiffcat 09.12.2011 09:21

Ответ: Тормоза opengl
 
яже написал что сделал эмуляцию анимирования модели (я ее крутил), что с анимацией что без, фпс не упал. Все это на VBO, без VBO там вообще пару фпс выдает:-D, вот еще, как определить в поле видимости модель или нет? Чтобы ее не рисовать.

HolyDel 09.12.2011 12:02

Ответ: Тормоза opengl
 
тьфу. я думал у тебя скининг. с трансформацией не упадет, да :)

pozitiffcat 09.12.2011 12:21

Ответ: Тормоза opengl
 
Не могу повернуть точку исходя из положения кости... вот есть у меня позиция кости XYZ, и кватернион поворот кости, и дана точка, как ее повернуть?

HolyDel 09.12.2011 12:44

Ответ: Тормоза opengl
 
Код:

vec3 VertexTransform(vec3 p, int index)
{
    int i = index * 7;
 
    // restore rotation component (quaternion)
    float x = bones[i];
    float y = bones[i+1];
    float z = bones[i+2];
    float w = bones[i+3];
 
    // restore offset component (vec3)
    float tx = bones[i+4];
    float ty = bones[i+5];
    float tz = bones[i+6];
 
    // original code from DooM 3 SDK
    float xxzz = x*x - z*z;
    float wwyy = w*w - y*y;
    float xw2 = x*w*2.0;
    float xy2 = x*y*2.0;
    float xz2 = x*z*2.0;
    float yw2 = y*w*2.0;
    float yz2 = y*z*2.0;
    float zw2 = z*w*2.0;
    vec3 ret = vec3((xxzz + wwyy)*p.x + (xy2 + zw2)*p.y      + (xz2 - yw2)*p.z,
                    (xy2 - zw2)*p.x  + (y*y+w*w-x*x-z*z)*p.y + (yz2 + xw2)*p.z,
                    (xz2 + yw2)*p.x  + (yz2 - xw2)*p.y      + (wwyy - xxzz)*p.z);
 
    return ret + vec3(tx, ty, tz);
}


pozitiffcat 09.12.2011 17:54

Ответ: Тормоза opengl
 
хер знает, весь мозг съел уже! Модель вроде как делает преобразования, но она вся ломаная. Вроде видно как шагает и все такое... хрен знает, перемануалил кучу инфы уже. Я в ступоре.

HolyDel 09.12.2011 18:34

Ответ: Тормоза opengl
 
ну с индексацией наверное что то. покажи код.


реквестирую еще котов в тред

pozitiffcat 09.12.2011 20:15

Ответ: Тормоза opengl
 
Код:

//функция установки фрейма (skin->SetVertices)
//сбросить все точки в стартовые позиции
        for(int j=0;j<cntVerts;j++)
        {
                verts[j*3] = src[j].coord[0];//src это статичные данные о сетке, verts это которые получит потом видеокарта
                verts[j*3+1] = src[j].coord[1];
                verts[j*3+2] = src[j].coord[2];
        }
        for(int i=0;i<bone.size();i++)
        {
                if(frame>= bone[i]->frames.size()) frame=0;//проверяю на окончание всех кадров
                float* cBone = bone[i]->GetTransformedBone((int)frame);//трансформированая кость (глобально)
                for(int j=0;j<bone[i]->verts.size();j++)//пройтись по всем вершинам этой кости
                {               
                        int idv = bone[i]->verts[j].id;//текущая кость
                        float weight = bone[i]->verts[j].weight;//ее вес
                        float *pos = RotatedXYZ(//узнать новую позицию
                                verts[idv*3],
                                verts[idv*3+1],
                                verts[idv*3+2],
                                bone[i]->frames[frame]->rotation[1],//x если вычисления новой позиции не производить то модель нормально отображается
                                bone[i]->frames[frame]->rotation[2],//y
                                bone[i]->frames[frame]->rotation[3],//z
                                bone[i]->frames[frame]->rotation[0]);//w
                        verts[idv*3] = pos[0];//+cBone[0];//тут хз,
                        verts[idv*3+1] = pos[1];//+cBone[1];
                        verts[idv*3+2] = pos[2];//+cBone[2];
                }
        }
//трансформированая кость (глобально) функция рекурсивная
float* sBoneSkin::GetTransformedBone(int frame)
{
        float* bypos;
        if(parent!=NULL) bypos = parent->GetTransformedBone(frame);//пособирать позиции у парентов
        else
        {
                bypos = new float[3];
                bypos[0] = frames[frame]->position[0];
                bypos[1] = frames[frame]->position[1];
                bypos[2] = frames[frame]->position[2];
        }
        float* pos = RotatedXYZ(bypos[0],bypos[1],bypos[2],
                frames[frame]->rotation[1],frames[frame]->rotation[2],frames[frame]->rotation[3],frames[frame]->rotation[0]);
        return pos;
}

//вычисление позиции функция
float* RotatedXYZ(float vx, float vy, float vz, float bq0, float bq1, float bq2, float bq3)//w третья
{
        float xxzz = bq0*bq0 - bq2*bq2;
        float wwyy = bq3*bq3 - bq1*bq1;
        float xw2 = bq0*bq3*2.0;
        float xy2 = bq0*bq1*2.0;
        float xz2 = bq0*bq2*2.0;
        float yw2 = bq1*bq3*2.0;
        float yz2 = bq1*bq2*2.0;
        float zw2 = bq2*bq3*2.0;
        float ret[3];
        ret[0] = (xxzz + wwyy)*vx + (xy2 + zw2)*vy      + (xz2 - yw2)*vz;
        ret[1] = (xy2 - zw2)*vx  + (bq1*bq1+bq3*bq3-bq0*bq0-bq2*bq2)*vy + (yz2 + xw2)*vz;
        ret[2] = (xz2 + yw2)*vx  + (yz2 - xw2)*vy      + (wwyy - xxzz)*vz;
        return ret;
}

//функция передачи буфера видеокарте
void cMeshNode::UpdateVBO()//для анимаций
{
        if(skin==NULL) return;//ниче не делать если нет анимации
        skin->SetVertices(vertices, buf_verts,cntVerts,current_frame);//та что самая первая в этом посте
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_verts );       
        glBufferSubDataARB(GL_ARRAY_BUFFER_ARB,0,cntVerts*3*sizeof(float),&buf_verts[0]);//ну тут я заменяю старый буфер буфер
        current_frame+=0.1f;
}


//функция отрисовки (не к теме, тут все норм, правда медленный алгоритм)
void cMeshNode::DrawVBO(GLenum draw_mode)
{
        if(cntVerts<=0) return;
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_verts );                                        //вершины
    glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_normals );                                //нормали
        glNormalPointer( GL_FLOAT, 0, (char*)NULL);
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_texcoords );                                //текстуры
    glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
       
        for(int i=0;i<surfaces.size();i++)//рисовать массивами исходя из данных материала (для быстродействия)
        {
                if(surfaces[i]->texture!=NULL)
                {
                        glEnable(GL_TEXTURE_2D);
                        surfaces[i]->texture->Bind();
                }
                else
                {
                        glDisable(GL_TEXTURE_2D);
                }
                int start = 0;
                int end = 0;
                start = surfaces[i]->surfaceNum * 3;
                if(i<surfaces.size()-1)
                        end =  surfaces[i+1]->surfaceNum * 3;
                else end = cntIndices;
                glDrawRangeElements(draw_mode, 0, cntIndices, end-start,GL_UNSIGNED_INT,&indices[start]);
        }
}

ХЗ как на форуме запрятать эту портянку в кнопку так что сорри

ЗЫ. Заодно посмотрите может где код парашный...


Часовой пояс GMT +4, время: 19:03.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot