Gamedev LectureФорум

Лекция #20. Меши: оптимизация под vcache, strips, оптимальный вывод в OpenGL, VBO [Лектор - cppguru] (комментарии)

#0
15:20, 7 янв 2009

Лекция #20. Меши: оптимизация под vcache, strips, оптимальный вывод в OpenGL, VBO [Лектор - cppguru] (комментарии)

Это сообщение сгенерировано автоматически.

#1
15:20, 7 янв 2009

>в общем, glBindBuffer дешёвые, не стесняйтесь сделать несколько буферов
>[16:12] <cppguru> так что, нет необходимости пихать всё в один буфер
>[16:13] <cppguru> обратите внимание, что glVertexPointer вызывается последней перед glDrawElements
всё-таки непонятно: лучше делать один буфер для нормалей и вертексов (и те и другие изменяются каждый кадр) или два разных буфера ? Я пробовал и так и так - когда один общий, то быстродействие немного выше.
Вар 1. Для двух разных буферов:

        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id11 );  // буфер нормалей
          glNormalPointer   (    GL_FLOAT, 0, (void *)0        );

        glClientActiveTextureARB(GL_TEXTURE0_ARB);
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id2 );  // буфер текстур
            glTexCoordPointer ( 2, GL_FLOAT, 0, 0 );
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, 0 );

        glClientActiveTextureARB(GL_TEXTURE1_ARB);
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id2 );  // буфер текстур
            glTexCoordPointer ( 2, GL_FLOAT, 0, 0 );
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, 0 );

        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id1 );  // буфер вертексов
          glVertexPointer   ( 3, GL_FLOAT, 0, (void *)0        );
          glBindBufferARB   ( GL_ELEMENT_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id3 );  // буфер индексов
          glIndexPointer    ( GL_UNSIGNED_INT, 0, 0 );
          glDrawElements    ( GL_TRIANGLES, Model[i].Object[indexO].count, GL_UNSIGNED_INT, 0 );
        glBindBufferARB   ( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );

Вар 2. Для одного буфера:

        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id1 );  // буфер нормалей и вертексов
          glNormalPointer   (    GL_FLOAT, Model[i].Object[indexO].StrideBuf, (void *)0        );
          glVertexPointer   ( 3, GL_FLOAT, Model[i].Object[indexO].StrideBuf, (void *)Model[i].Object[indexO].strideVert );

        glClientActiveTextureARB(GL_TEXTURE0_ARB);
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id2 );  // буфер текстур
            glTexCoordPointer ( 2, GL_FLOAT, 0, 0 );
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, 0 );

        glClientActiveTextureARB(GL_TEXTURE1_ARB);
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id2 );  // буфер текстур
            glTexCoordPointer ( 2, GL_FLOAT, 0, 0 );
        glBindBufferARB   ( GL_ARRAY_BUFFER_ARB, 0 );

          glBindBufferARB   ( GL_ELEMENT_ARRAY_BUFFER_ARB, Model[i].Object[indexO].Id3 );  // буфер индексов
          glIndexPointer    ( GL_UNSIGNED_INT, 0, 0 );
          glDrawElements    ( GL_TRIANGLES, Model[i].Object[indexO].count, GL_UNSIGNED_INT, 0 );
        glBindBufferARB   ( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );

второй вариант, вопреки утверждению что лучше в разных буферах хранить, чуть быстрее, но ненамного.  В чём правда ?

Gamedev LectureФорум

Тема в архиве.