Russian Qt Forum
Ноябрь 01, 2024, 06:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QOpenGLVertexArrayObject  (Прочитано 5429 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Февраль 02, 2015, 15:59 »

Привет, друзья!
Мне не удаётся до конца понять, что из себя представляет vao. Прошу помочь разобраться.

Вот мои додумки:
Если я имею GLWidget (или, наверное, правильнее сказать контекст GL, тоже до конца не понял назначения, видимо из-за того, что мне его не надо "делить"), то я уже имею по умолчанию некий неявно прикрученный (bind) vao.
Когда я подключаю некий QOpenGLBuffer1 и задаю ему параметры атрибутов, то эти изменения происходят именно в vao.
Допустим, после прорисовки содержимого QOpenGLBuffer1 я прикручу QOpenGLBuffer2, у которого атрибутов меньше, чем у прошлого. Далее я настрою атрибуты для QOpenGLBuffer2 (при этом не отключая атрибуты QOpenGLBuffer1). При попытке нарисовать содержимое есть вероятность, что я получу либо ошибку, либо странную картинку, либо сегфол.

Так вот хочу понять, при переключении буферов именно vao хранит состояние атрибутов? То есть для выше изложенного необходимо создать vao1 и vao2 да переключать их вместе с буферами?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 04, 2015, 15:59 »

Так вот хочу понять, при переключении буферов именно vao хранит состояние атрибутов? То есть для выше изложенного необходимо создать vao1 и vao2 да переключать их вместе с буферами?
QOpenGLBuffer - это "обертка" над "ID" (слотом) в OpenGL. Он может управляться через vao или руками. Вы можете создать N буферов и заполнить их данными, но в данном (текущем) рисовании только один (данного типа) может быть активен. Конечно число данных в буфере должно сбиваться с тем что ожидает рисование (напр glDrawElements), иначе нечего удивляться вылету.

Какое-то у Вас с "обсевером" изучение - ну совсем не творческое. Зубрите классы - а толку?  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Февраль 04, 2015, 16:22 »

Что делает буфер я понимаю.
Он может управляться через vao или руками.
Руками - я понимаю следующее:
Создавать, биндить, заполнять данными, считывать при рендеринге.
с vao всё по-прежнему не понятно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 04, 2015, 17:06 »

Руками - я понимаю следующее:
Создавать, биндить, заполнять данными, считывать при рендеринге.
Создавать, заполнять данными, перед рисованием биндить, потом отключать

с vao всё по-прежнему не понятно.
Все то же самое, неск "ID" (разных типов) могут быть объединены в набор и "забиндены/унбиндены" одним вызовом. Насколько помню появилось в 2008, т.е. есть вероятность (пусть небольшая) что карта старовато. Поэтому живу без этой плюшки  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Февраль 04, 2015, 17:27 »

Прозрел. Спасибо.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Март 10, 2015, 18:43 »

А этот vao не заведует всякими положениями glEnable(GL_DEPTH_TEST) и program.enableAttributeArray(vertex)?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Март 10, 2015, 19:00 »

Меня интересует, при переключении между программами с освещением и без освещения, можно ли избежать постоянного enableAttributeArray, disableAttributeArray?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 10, 2015, 19:15 »

Меня интересует, при переключении между программами с освещением и без освещения, можно ли избежать постоянного enableAttributeArray, disableAttributeArray?
Что Вы называете "программой"? GLSL извращения?  Улыбающийся Если так, то я бы не стал ничего избегать, и делал бы два шейдера, для освещения и без. Не надейтесь отпихнуться if'ами
Код
C++ (Qt)
if (lightOn) {
...
}
Нормальный человек полагает что если lightOn = false, то ветка не выполняется и проц не грузит. Но это не так в GLSL - ветка все равно выполняется и карту грузит. Поэтому о таких мелочах как enable/disable неудобно и говорить  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Март 10, 2015, 19:21 »

Программой я называю QOpenGLShaderProgram.
Дело в том, что двум программам нужно разное количество входных параметров (атрибутов). Если при переключении программ не перекрывать (disableAttributeArray) атрибуты первой программы или не резрешать (enableAttributeArray) атрибуты второй программы, то можно либо ничего не получить на экране, либо вообще вылететь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.147 секунд. Запросов: 23.