Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 09.04.2016
Сообщений: 3
1

Работа с VAO,VBO и glVertexAttribPointer

14.04.2016, 18:14. Показов 2479. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, ЯП C++

Имеется функция рисующая все элементы из vector'a

У каждого элемента есть свой VBO, структура VBO у всех элементов идентична

Вначале отрисовки функция биндит VAO и после перебирает все элементы vector'а и для каждого биндит его же VBO, после бинда VBO для каждого элемента идут вызовы glVertexAttribPointer обозначая те же самые оффсеты(т.е для каждого элемента эти вызовы идентичны).

Возможно ли как то привязать эти вызовы glVertexAttribPointer к VAO чтобы использовать между разными VBO, не повторяя эти вызовы для каждого из VBO

Сейчас что то на подобе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vector<RenderObj> oblist;
//...
  glBindVertexArray(VAO);
 
  glEnableVertexAttribArray(0);
  glEnableVertexAttribArray(1);
 
for each(RenderObj* obj in oblist)
{
  glBindBuffer(GL_ARRAY_BUFFER, obj->VBO);
 
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(ObjectVertexData), 0);
  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(ObjectVertexData), 12);
 
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj->IBO);
  glDrawElements(GL_TRIANGLES, obj->IndexNum, GL_UNSIGNED_INT, (void*)0);
}
Хотелось бы что то вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<RenderObj> oblist;
//...
  glBindVertexArray(VAO);
 
  glEnableVertexAttribArray(0);
  glEnableVertexAttribArray(1);
 
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(ObjectVertexData), 0);
  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(ObjectVertexData), 12);
 
for each(RenderObj* obj in oblist)
{
  glBindBuffer(GL_ARRAY_BUFFER, obj->VBO);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj->IBO);
  glDrawElements(GL_TRIANGLES, obj->IndexNum, GL_UNSIGNED_INT, (void*)0);
}
Возможно ли это? На сколько я знаю вызовы glVertexAttribPointer привязываются к действующему VBO. Протестировать сейчас нет возможности, хочется узнать как такое реализуется.

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2016, 18:14
Ответы с готовыми решениями:

Не работает vao и vbo
Здравствуйте, собственно вопрос, а почему когда я нахожу примеры с vao и vbo, то много функций у...

Мультитекстуринг с VAO или VBO
Здравствуйте, проблема состоит в том , что не могу совместить мультитекстуринг и VAO , кто может ,...

VAO, VBO и их правильное применение
Всех с наступившем, в общем меня интересует вопрос как правильно использовать VBO и VAO чтобы...

Пример использования VAO + VBO
Добрый день. Поделитесь примером использования VAO + VBO, которые реализованы не на WinAPI....

1
3455 / 1643 / 236
Регистрация: 26.02.2009
Сообщений: 8,035
Записей в блоге: 5
15.04.2016, 12:30 2
Цитата Сообщение от xssnick Посмотреть сообщение
Возможно ли это?
К сожалению так как вы хотите нельзя. Ибо в момент вызова glVertexAttribPointer VAO запоминает текущий VBO, а отдельный вызов glBindBuffer(GL_ARRAY_BUFFER, obj->VBO); никак не влияет на VAO. Однако glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj->IBO); влияет и это часто запутывает логику программистов.

Можно не пересобирать VAO а изменять только данные VBO, который уже есть в VAO... не знаю на сколько вам такая опция полезна...

Добавлено через 17 минут
Можно сделать VAO на каждый объект свой и собирать его только 1 раз, а в отрисовку сделать так:
C++
1
2
3
4
5
6
for each(RenderObj* obj in oblist)
{
  glBindVertexArray(obj->VAO);
  glDrawElements(GL_TRIANGLES, obj->IndexNum, GL_UNSIGNED_INT, (void*)0);
}
glBindVertexArray(0);
Но вроде есть ограничения на кол-во VAO влияющие на производительность(особенно на nVidia картах).
У AMD - 2000 VAO, у nVidia - 200. Но лучше самому это проверить, так как это было в момент выхода OpenGL 3.3 и сообщить о результатах здесь (:
0
15.04.2016, 12:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2016, 12:30
Помогаю со студенческими работами здесь

Падение FPS при использовании VBO и VAO
Я модифицирую код движка одной старой игры 2001-ого года и решил добавить шейдеры для модификации...

Меш, VBO, VAO, IBO, отрисовка треугольников
Добрый вечер, хочу попросить по возможности совет и коррекцию кода. Дан VBO с координатами и...

Отрисовка куба через VAO, VBO, EBO
Всем привет Относительно недавно начала изучать OpenGL. Около недели курил glut, теперь перешёл на...

Общий vao (vbo) для различных окон (контекстов)
У меня есть два GL окна, в которые я хочу выводить одни и те же объекты (модели). Если я создал и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru