Re[2]: Оптимизация игры на С++
От: 5y5e1  
Дата: 28.07.07 10:00
Оценка:
Здравствуйте, Phoenics, Вы писали:

P>Возможно ты не правильно используешь VBO, например пересоздаёшь его каждый кадр, или многократно отправляешь туда данные... Как говрится код в студию. Где VBO делаешь, где отрисовка происходит...


Эта процедура вызывается каждый кадр
int Terrain::draw() // return FPC
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_TEXTURE_COORD_ARRAY );

    glBindBufferARB( GL_ARRAY_BUFFER_ARB, meshVBO );
    glVertexPointer( 3, GL_FLOAT, 0, (char *)NULL );
        
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, texVBO );
    glTexCoordPointer( 2, GL_FLOAT, 0, (char *)NULL );

    glDrawArrays( GL_TRIANGLE_STRIP, 0, number_of_vertex);
    
    glDisableClientState( GL_VERTEX_ARRAY );
    glDisableClientState( GL_TEXTURE_COORD_ARRAY );

    int ret =  (int)(1000.0f/ timer->get_time());
    timer->flush();
    return ret;
}



Эта единожды при инициализации
void Terrain::buildVBO() {
    if( IsExtensionSupported("GL_ARB_vertex_buffer_object")) {
        glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
        glBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");
        glBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");
        glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");
    }else {
        MessageBox( NULL, "VBO doesn't supported!", "ERROR", MB_OK | MB_ICONERROR );
        PostQuitMessage( 0 );
    }

    glGenBuffersARB( 1, &meshVBO );
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, meshVBO );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, number_of_vertex * 3 * sizeof(float), matrix, GL_STATIC_DRAW_ARB );

    glGenBuffersARB( 1, &texVBO );
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, texVBO );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, number_of_vertex * 2 * sizeof(float), textures, GL_STATIC_DRAW_ARB );

    free( matrix );   matrix = NULL;
    free( textures ); textures = NULL;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.