Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: __Heaven__ от Февраль 02, 2015, 15:59



Название: QOpenGLVertexArrayObject
Отправлено: __Heaven__ от Февраль 02, 2015, 15:59
Привет, друзья!
Мне не удаётся до конца понять, что из себя представляет vao. Прошу помочь разобраться.

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

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


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

Какое-то у Вас с "обсевером" изучение - ну совсем не творческое. Зубрите классы - а толку?  :)


Название: Re: QOpenGLVertexArrayObject
Отправлено: __Heaven__ от Февраль 04, 2015, 16:22
Что делает буфер я понимаю.
Он может управляться через vao или руками.
Руками - я понимаю следующее:
Создавать, биндить, заполнять данными, считывать при рендеринге.
с vao всё по-прежнему не понятно.


Название: Re: QOpenGLVertexArrayObject
Отправлено: Igors от Февраль 04, 2015, 17:06
Руками - я понимаю следующее:
Создавать, биндить, заполнять данными, считывать при рендеринге.
Создавать, заполнять данными, перед рисованием биндить, потом отключать

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


Название: Re: QOpenGLVertexArrayObject
Отправлено: __Heaven__ от Февраль 04, 2015, 17:27
Прозрел. Спасибо.


Название: Re: QOpenGLVertexArrayObject
Отправлено: __Heaven__ от Март 10, 2015, 18:43
А этот vao не заведует всякими положениями glEnable(GL_DEPTH_TEST) и program.enableAttributeArray(vertex)?


Название: Re: QOpenGLVertexArrayObject
Отправлено: __Heaven__ от Март 10, 2015, 19:00
Меня интересует, при переключении между программами с освещением и без освещения, можно ли избежать постоянного enableAttributeArray, disableAttributeArray?


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


Название: Re: QOpenGLVertexArrayObject
Отправлено: __Heaven__ от Март 10, 2015, 19:21
Программой я называю QOpenGLShaderProgram.
Дело в том, что двум программам нужно разное количество входных параметров (атрибутов). Если при переключении программ не перекрывать (disableAttributeArray) атрибуты первой программы или не резрешать (enableAttributeArray) атрибуты второй программы, то можно либо ничего не получить на экране, либо вообще вылететь.