Войти
ПрограммированиеФорумОбщее

Новый OGL пытаюсь вникнуть

#0
23:17, 29 дек. 2014

Всем привет!
Вот решил отбросить старые glBegin и glEnd и перейти к чему-то более серьёзному. Читал туториалы по новому огл. В общих чертах всё ясно. Но не понятна такая вещь:
Допустим имеем много различных классов, которые представляют игровые объекты. Каждый класс наследуется от какого-то одного класса-интерфейса, в котором есть метод display().
Далее в главном цикле просто от каждого объекта вызывается этот самый display(). В старом огле всё было просто. В каждом объекте рисуешь что надо и всё. В новом требуется инициализация буферов их создание и привязка. В дефолтном примере нового огла в мейне создаётся и задаётся два буфера: вершинный и буфер атрибутов(вроде так). Но это для одного объекта. А если я имею множество этих объектов с меняющимися координатами и параметрами. Для каждого объекта держать свой буфер и в display() биндить его? А если эти координаты нужно изменить? Нужно будет снова генерировать этот буфер?
Возможно не очень понятно изложил, но может кто-нибудь помочь разъяснить эту проблему. Как рисовать различные объекты из разных буферов вершин?
Если кому не лень, можете ли набросать какой-нить псевдокод для моего случая.
Заранее спасибо!


#1
0:42, 30 дек. 2014

1.

Для каждого объекта держать свой буфер и в display() биндить его?

Да. Можно еще батчинг запилить (несколько буфферов от разных обьектов держать в одном)

2.

Нужно будет снова генерировать этот буфер?

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

3.

Как рисовать различные объекты из разных буферов вершин?

смотри 1.

простейшй случай:
1. при создании обьекта делаем ему VBO и VAO
  glGenBuffers(1, @fBufferID); // VBO
  glNamedBufferData(fBufferID, bufLen * sizeof(TVertexType), @buffer[0], GL_STATIC_DRAW); // LOAD DATA

2. Привязываем VAO
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, fBufferID); // BIND VBO FIRST
  glGenVertexArrays(1, @fVaoId);
  - для каждого атрибута вертекса:
    -glVertexAttribPointer(..)
    -glEnableVertexAttribArray(..)

все
теперь для отрисовки:
3.
  glBindVertexArray(..); // BIND VAO ONLY
  glDrawArrays(..); // DRAW

еще нада кроме этого загрузить и забиндить минимальные вертексный и фрагментный шейдеры конечно

P.S. на параметры в некоторых ф-ях не обращать внимания, выдрал из рабочего кода )

#2
1:43, 30 дек. 2014

veth
Спасибо!
Для того чтобы изменить координаты нужно будет что-то вроде этого сделать:

+ Показать

так?
Можно поподробнее про VAO. Для каждого объекта он свой?

Как я понял структура будет примерна такой:

+ Показать

#3
18:15, 30 дек. 2014

DoctorSwat
Есть же объекты с неизменяемой геометрией (оружии, ящики всякие итд), которые многократно дублируются в игре - надо держать ссылку на один VBO
И для скелетных моделей (людей итд) можно также использовать один VBO и множить вершины на матрицу кости в шейдере

#4
7:56, 31 дек. 2014

glNamedBufferData - это что такое?

DoctorSwat
> Для того чтобы изменить координаты
Тебе для чего? Двигать объекты надо матрицами. Если край как надо изменить вершины, тогда заново заливать буфер в VBO.

#5
10:33, 31 дек. 2014
glNamedBufferData - это что такое?

Это OpenGL 4

https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

#6
12:02, 31 дек. 2014

veth
> Это OpenGL 4
Точнее 4.5. А он мало где реализован. Даже у меня достаточно новая NVidia GeForce 755M его на последних драйверах не поддерживает, хотя ARB_direct_state_access появился после последнего обновления драйвера.
Так что не советую пока использовать функцию glNamedBufferData. Работать почти нигде не будет.

#7
15:21, 31 дек. 2014

gammaker
> Так что не советую пока использовать функцию glNamedBufferData. Работать почти
> нигде не будет.
Workaround пишется за несколько часов. Так что советую использовать.

#8
16:36, 31 дек. 2014

eagle
> Workaround пишется за несколько часов. Так что советую использовать.
И что, писать один и тот же код дважды? Не всё из direct state access возможно сэмулировать, написав такую же функцию с тем же интерфейсом, но без посторонних побочных эффектов или запроса состояния через glGet*. А некоторые вещи и через glGet* запросить невозможно, например, glBindTextures. А glGet вроде бы очень медленный и его не рекомендуют использовать на каждом шагу.

#9
17:13, 31 дек. 2014

все проще
В wglGetProcAddress запрашивай ф-ю glNamedBufferDataEXT

Перед этим можешь еще проверить GL_EXT_direct_state_access

ПрограммированиеФорумОбщее

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