Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Компьютерная графика » Программирование графики и GPU » Обсуждение статьи о расширении ARB_vertex_buffer_object.


Обсуждение статьи о расширении ARB_vertex_buffer_object.

Сообщений 1 страница 20 из 20

1

Ссылка на статью: http://steps3d.narod.ru/tutorials/tutorial-VBO.html

Уважаемый Алексей Викторович можно взять кусочек вашей статьи? Указание вашего имени и сайта уже есть. Статья тоже уже есть, в рамках учебниа по надстройке над OpenGL GLScene. Главным редактором и автором специальных статей коего я как раз являюсь.

Вот здесь http://www.glscene.ru/forum_viewtopic.php?6.5898.150 у нас происходит "обглатывание" моей статьи и вашей тоже. Не могли бы вы присоединится к обсуждению, дабы внести ясность о своей статье и, может быть, что-то узнать. Конечно придётся для этого зарегистрироваться, но я вас очень об этом прошу. Потому что вашей статьёй я весьма не доволен. В основном потому что не рассмотрен вывод на экран. Я не смотрел исходников, но поверьте, что не все используют C!

Да, вот моя статья, почитайте пожалуйста: http://rapidshare.de/files/47862871/VBO.doc.html . Она для Delphi, но должна быть понятна.

Отредактировано DungeonLords (2009-07-16 12:02:02)

0

2

>>>моё сообщение всем видно!? кто-нибудь, типа Steps3D, будет его читать!?<<<

Отредактировано DungeonLords (2009-07-18 12:15:02)

0

3

Кстати, о VBO. Есть вот такой цикл отрисовки 1000 точек. Феномен в том, что кол-во FPS, выдаваемое
приложением не зависит от того, собрано оно с -DENABLE_VBO или нет. Проверяю на двух Nvidia карточках: 8800GTS и 6150
Очень странно, если честно. Ведь 1000 glVertex3f() вызовов на кадр должно быть медленнее, чем один статический VBO!?
Может кто прокомментировать ситуацию?

Код:
        do
        {
                glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

                glRotatef(2.0, 1.0, 1.0, 1.0);
                glRotatef(1.0, 0.0, 1.0, 1.0);

                glColor4ub(255, 255, 255, 255);
#ifndef ENABLE_VBO
                glBegin(GL_POINTS);

                for(i = 0; i < NB_PIXELS; i++)
                {
                        glVertex3f(pixels[3*i], pixels[3*i+1], pixels[3*i+2]);
                }
                glEnd();
#else /* defined ENABLE_VBO */
                glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
                glEnableClientState(GL_VERTEX_ARRAY);

                glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboBufID);
                glVertexPointer(3, GL_FLOAT, 0, 0);
                glDrawArrays(GL_POINTS, 0, NB_PIXELS);

                glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
                glPopClientAttrib();
#endif /* ENABLE_VBO */

                SDL_GL_SwapBuffers();
                frames++;

                gettimeofday(&time, NULL);
                currentTime = time.tv_sec + time.tv_usec * 1e-6;
                timeDelta = currentTime - startTime;

                if (timeDelta > 5.0)
                {
                        printf("%f\n", frames / timeDelta);
                        startTime = currentTime;
                        frames = 0;
                }

                if (SDL_PollEvent(&event))
                {
                        if(event.type & SDL_KEYDOWN)
                                done = 1;
                }
        }
        while(!done);

0

4

Просто данные буферизуются, и скорее всего, размер буфера достаточно велик.
Каждая команда glVertex просто добавляет новую порцию данных, а пересылаются они большими блоками.
Кроме того, для современных видеокарт 1000 точек это очень мало.
Кроме того на FPS может влиять включанная вертикальная синхронизация.
Основной плюс VBO - то что данные уже находятся в памяти GPU и их не надо передавать по шине. Но чтобы это реально сработало нужен большой объем данных

"Кусочек из моей статьи" взять можно с указанием источника

0

5

matr
у меня в приложении использование VBO с 1кк треугольников статического меша с попиксельным освещением дало очень существенный прирост производительности в сравнении с пересылкой данных через glVertex, glTexCoord...
В реальных случаях использование VBO всегда предпочтительнее. Тем более, что пересылки типа glVertex считаются deprecated с версии OGL 3.1.

Отредактировано Ruba (2009-07-24 15:25:48)

0

6

Steps3D написал(а):

Кроме того, для современных видеокарт 1000 точек это очень мало.

Ага, спасибо. Просто я взял первый попавшийся готовый пример из SDL и прикрутил к нему поддержку VBO.
Видимо, не самый удачный. Потому и FPS около 6300 на 8800GTS в обоих режимах.

Ruba написал(а):

у меня в приложении использование VBO с 1кк треугольников статического меша с попиксельным освещением дало очень существенный прирост производительности в сравнении с пересылкой данных через glVertex, glTexCoord...

Мой код на питоне до перехода на VBO тормозил на порядок. Сейчас же разница около 1% (:

0

7

Ruba написал(а):

Тем более, что пересылки типа glVertex считаются deprecated с версии OGL 3.1.

А что значит deprecated?

Теперь о статье. Стоит сделать выговор автору, что он пропустил самое главное - момент отрисовки.

И вот ещё вопрос к Steps3D [вырезка из статьи]:
void glBindBufferARB ( GLenum target, GLuint buffer );
Параметр target задает тип данных, которые будет содержать буфер - информацию о вершинах (GL_ARRAY_BUFFER_ARB) или индексы в другие массивы (GL_ELEMENTS_ARRAY_BUFFER_ARB).

А вот что значит индексы в другие массивы и что ещё за другие массивы не сказано.

Отредактировано DungeonLords (2009-08-25 18:12:18)

0

8

Есть массивы непосредственно с данными (вершгинами, цветами, текстурными координатми и т.п.) - они задают данные для каждой вершины.
А есть массив индексов в эти массивы, т.е. как собирать эти вешины в грани

0

9

Steps3D написал(а):

А есть массив индексов в эти массивы, т.е. как собирать эти вешины в грани

Позвольте мне задать простые вопросы и получить на них полный ответ. Что такое грань? И второй вопрос, зачем нам иметь индексы в эти массивы, как это вообще устроено? И что значит ИНДЕКС в массив?

0

10

Откройте учебник и прочтитайте про массивы
грань - полигон, обычно треугольник, задаваемый наборов вершин. Как правило у нас много полигонов и большинство врешин принадлежат сразу нескольким полигонам. Поэтому удобнее задавать каждый полигон не набором вершин, а набром ссылок (индексов) в массив вершин, поскольку индекс (целое число) в худщем случае занимает 4 байта

0

11

Steps3D написал(а):

Поэтому удобнее задавать каждый полигон не набором вершин, а набром ссылок (индексов) в массив вершин, поскольку индекс (целое число) в худщем случае занимает 4 байта

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

0

12

Все равно компактнее получается - обычно вершина принадлежит 3-4 полигонам, так что явный выигрышь
Кроме того во многих случаях индекс может быть вообще 2-байтным, а это еще больше выигрышь
Кроме того есть всякие дополнительные плюсы - может быть несколько индексных буферов на один вершинный, например LODы

0

13

Ага, понял теперь и это и смысл ваших слов из статьи ("void glBindBufferARB ( GLenum target, GLuint buffer );
Параметр target задает тип данных, которые будет содержать буфер - информацию о вершинах (GL_ARRAY_BUFFER_ARB) или индексы в другие массивы (GL_ELEMENTS_ARRAY_BUFFER_ARB).").

Но теперь у меня есть замечания.

У вас в статье написано: "индексы в другие массивы (GL_ELEMENTS_ARRAY_BUFFER_ARB)". Но это очень трудно читается и мне кажется некорректно! Может лучше написать, что "индексы для вершин в один из четырёх массивов (в GIVertexPointer, GINormalPointer, GlColorPointer, GlTexCoordPointer)" Как вы думаете?

Вот теперь возьмём этот фрагмент из статьи: "информацию о вершинах (GL_ARRAY_BUFFER_ARB)" и поговорим. Скажите, вот я ведь пишу:
glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer[1]);
glBufferData( GL_ARRAY_BUFFER, sizeof(GLFloat)*(high(TexCoords)+1), @TexCoords[0], GL_STATIC_DRAW );
glTexCoordPointer(2, GL_FLOAT, 0, nil);
glBindBuffer( GL_ARRAY_BUFFER, 0);
[код Delphi, здесь vertexBuffer[1] это массив типа GLInt]. И здесь в дальнейшем буду использовать vertexBuffer[1] для текстуры. И обратите внимание, для текстуры и при glBindBuffer(GL_ARRAY_BUFFER... Что скажите?

Steps3D написал(а):

Кроме того во многих случаях индекс может быть вообще 2-байтным, а это еще больше выигрышь

Простите, что надоедаю, но можно теперь об этом? Просто вы даёте такие ответы, что приходится высасывать из пальца дополнительные вопросы.

Отредактировано DungeonLords (2009-08-25 19:54:16)

0

14

Массив индексов это или массив int'ов или массив short'ов
использование short'ов просто снизит вдвое затраты памяти на массив

0

15

DungeonLords написал(а):

Но теперь у меня есть замечания.
У вас в статье написано: "индексы в другие массивы (GL_ELEMENTS_ARRAY_BUFFER_ARB)". Но это очень трудно читается и мне кажется некорректно! Может лучше написать, что "индексы для вершин в один из четырёх массивов (в GIVertexPointer, GINormalPointer, GlColorPointer, GlTexCoordPointer)" Как вы думаете?
Вот теперь возьмём этот фрагмент из статьи: "информацию о вершинах (GL_ARRAY_BUFFER_ARB)" и поговорим. Скажите, вот я ведь пишу:
glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer[1]);
glBufferData( GL_ARRAY_BUFFER, sizeof(GLFloat)*(high(TexCoords)+1), @TexCoords[0], GL_STATIC_DRAW );
glTexCoordPointer(2, GL_FLOAT, 0, nil);
glBindBuffer( GL_ARRAY_BUFFER, 0);
[код Delphi, здесь vertexBuffer[1] это массив типа GLInt]. И здесь в дальнейшем буду использовать vertexBuffer[1] для текстуры. И обратите внимание, для текстуры и при glBindBuffer(GL_ARRAY_BUFFER... Что скажите?

Мне это главное. Что скажите?

Отредактировано DungeonLords (2009-08-25 20:50:36)

0

16

Алексей очень прав почти во всем.
Во первых, использвать для индексов достаточно unsigned short. Это тоже избыточно, но однобайтного типа не хватит. Во вторых использование индексов является обязательным условием для включения Post TNL кеша ускорителя, что может дать значительный прирост скорости.

Другой вопрос в том, что полностью избавиться от дублирования вершин не получится (дублирование может произойти как из-за банальной С1 не гладкости поверхности (вершины придется дублировать из-за отсутствия Smooth нормали), так и из-за оптимизаций данных под кэш видеокарты).

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

DungeonLords написал(а):

И здесь в дальнейшем буду использовать vertexBuffer[1] для текстуры. И обратите внимание, для текстуры и при glBindBuffer(GL_ARRAY_BUFFER... Что скажите?

Переформулируйте вопрос. Лично мне не понятно, что вам не понятно.

-1

17

Спасибо вам за замечания.

Вы открыли ещё одну проблему. Это прогал в статье о Post tnl кэше. Впринципе его описание можно скомуниздить отсюда: http://www.gamedev.ru/terms/VertexCache . И не поймите меня не правильно, я забочусь о всеохвате статьи и в интернете это абсолютно пероочерёдно!

crsib написал(а):

Переформулируйте вопрос. Лично мне не понятно, что вам не понятно.

ok.

Есть запись в статье Алексея о VBO:"void glBindBufferARB ( GLenum target, GLuint buffer );
Параметр target задает тип данных, которые будет содержать буфер - информацию о вершинах (GL_ARRAY_BUFFER_ARB)[ну и т.д.]". Ну так вот, один из буферов у меня НЕ содержит "информацию о вершинах", то есть другими словами я опровергаю часть статьи. Но поскольку я запросто могу наговорить глупостей я жду, что вы на это скажите...

Отредактировано DungeonLords (2009-08-26 22:29:26)

0

18

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

GL_ARRAY_BUFFER(_ARB) сообщает драйверу о том, что буфер будет использоваться как источник вершинных атрибутов.

GL_ELEMENTS_ARRAY_BUFFER(_ARB) сообщает о том, что данные из буфера будут использовать как индексы в массив(ы) вершинных атрибутов.

Конкретный тип атрибута вы задаете при вызове gl(Vertex/Normal/Color/...)Pointer.

Я так понимаю, что под информацией о вершинах Алексей и имел ввиду набор вершинных атрибутов, так как это в общем то синонимы

Отредактировано crsib (2009-08-27 16:19:15)

-1

19

2crsib,
отдельное спасибо за "вершинный атрибут"!

Ну и собственно пожелание Алексею: описать в своей статье POST TNL кэш.

0

20

Да, ещё, наверное последний вопрос, где можжно прочитать как использовать индексы? Желательно на русском, но на английском тоже сойдёт.

Отредактировано DungeonLords (2009-08-31 17:04:55)

0


Вы здесь » Компьютерная графика » Программирование графики и GPU » Обсуждение статьи о расширении ARB_vertex_buffer_object.


создать форум