Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Disa от Декабрь 30, 2012, 22:17



Название: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Disa от Декабрь 30, 2012, 22:17
Добрый вечер и с наступающими праздниками вас!

Раньше все делал просто, по шаблону - наследовал свою сцену от QGLWidget, дальше пихал нужные картинки либо в VBO, либо в VAO +  делаем нужное количество шейдеров и рисуем.
Соответственно в конструктор передавал нужный тип формата OpenGL.

Потом (уже писал в теме) увидел, что зачем-то нужно (или можно) отрисовывать QGLWidget внутри класса QGraphicsView.

Сейчас, посмотрев видео (http://www.youtube.com/watch?v=VxsS7u-vgc8), понял, что там все еще хитрее. Теперь наследуем класс от QWindow, в нем отдельная инициализация с заданием QSurfaceFormat, после чего делаем некую абстрактную сцену и рисуем ее.

Так же (видимо из-за пробелов в знании) заметил что существуют обертка для VBO и других буферных объектов в Qt (QGLBuffer)
 
Вопрос, который уже звучал у меня, но видимо я что-то не догоняю. Пока обертка QGLShaderProgram содержит загрузку из файла только для вершинного, фрагментного и геометрического шейдеров. То есть для тесселяции потребуется либо немного подождать, пока она не появиться, либо использовать другую обертку, либо наследовать QGLShaderProgram и добавлять руками загрузку.  

Так как нужно сделать, чтоб:
1). не изобрести велосипед
2). сделать не слишком ужасные классы состоящии из набора разношерстных оберток
3). использовать все возможности OpenGL 4.2 (ну или хотя бы 4.0-4.1). Точнее речь идет о тесселяции и совсем уже хорошо, если можно будет поиграться с compute shaders.


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Igors от Декабрь 30, 2012, 23:18
Вопрос, который уже звучал у меня, но видимо я что-то не догоняю. Пока обертка QGLShaderProgram содержит загрузку из файла только для вершинного, фрагментного и геометрического шейдеров. То есть для тесселяции потребуется либо немного подождать, пока она не появиться, либо использовать другую обертку, либо наследовать QGLShaderProgram и добавлять руками загрузку.  
Неясно что Вы имеете ввиду под "тесселяцией"? Разбиение полигонов на более мелкие (триангуляция)? SDS?
В любом случае шейдеры к этому никакого отношения не имеют - они отвечают за шейдинг (т.е. производство пикселей). Один шейдер может применяться ко всей геометрии или к ее части - Вы решаете.


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Disa от Декабрь 31, 2012, 00:43
Да, извините, уточню - генерация относительно большого количества вершин на GPU (например 14 отсюда http://nopper.tv/opengl.html).

Цитировать
Однако, хотя добавление геометрических шейдеров в OpenGL 3.2 и повысило гибкость конвейера рендеринга, но при этом оказалось, что геометрические шейдеры очень плохо подходят для генерации на GPU большого количества геометрии. Поэтому в архитектуру GPU следующего поколения (для NVidia - это Fermi) была добавлена аппаратная поддержка тесселляции, позволяющая прямо на GPU на основе одного примитива создавать большое количество новых примитивов.

Источник: http://steps3d.narod.ru/tutorials/tesselation-tutorial.html
Внизу статьи приведены алгоритмы аппаратной тесселяции.


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Igors от Декабрь 31, 2012, 01:19
Не думаю что "тесселяция" - такое уж общее понятие, оно всегда связано с какой-то конкретной задачей. Ну вот Ваш пример 14 (карта высоты). Построение модели гор решается без OpenGL, если адаптивность не требуется - пишется за день. Да, при смене resolution надо пересчитать модель, создать новые полигоны и вертексы. Да, будет пауза (доли секунды) - и что в этом страшного? Операция-то разовая.

Прошел по Вашей ссылке(ам) - не впечатляет, пока возможности довольно бедные (по сравнению с software). Скорость и использование GPU - дело хорошее, но здесь они особо не нужны. Конечно если пойти "на принцип" - типа "все только на OpenGL" - ну тогда да. А так эти заморочки себя не оправдывают (во всяком случае пока)


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Disa от Декабрь 31, 2012, 01:30
Так, еще небольшое уточнения. Все "современные свистелки" пока делаю чисто для себя, чтоб быть в тренде, так сказать. Ну то есть когда это понадобится, а я почти уверен что рано или поздно мне это понадобится, я мог бы сразу начать делать и сейчас я готов на изучение этого частично потратить свои выходные :)

Ну в общем меня пока больше интересует вопрос, если ли "правильная тактика" прикручивания OpenGL API (последней версии, которая поддерживает карта и драйвера клиента) к Qt и как она должна выглядеть, как при этом правильно ограничивать или изменять функционал и прочее (ну пример, если есть тот же compute shader, то считать систему физику частиц на нем, если нет, то на CPU). Повторюсь, что цели сугубо учебные, но я думаю их можно рассматривать, как некие долгосрочные инвестиции.


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Igors от Декабрь 31, 2012, 02:16
По поводу прикручивания все довольно очевидно. Если Вы не видите желанной тесселяции в доке Qt, то это практически гарантирует тернистый путь и уродливый велосипед.

Насчет "инвестиций" я Вас понял, но, на мой взгляд, вложение не очень удачное. Напр написав ту же карту высоты (в смысле построение модели) Вы приобретете намного больше знаний и, скажем так, "3D культуры" чем зазубривая вызовы OpenGL. Не стоит замыкаться в узком мирке "карта-драйвер"  :)

Физика частиц - ну этого я не знаю. Если Вам там все ясно и надо уже выжимать скорость - может и есть смысл связываться с GPU. А иначе нет.


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Disa от Январь 02, 2013, 12:56
Я вас понял, спасибо и с наступившим :)


Название: Re: QGLWidget, QWindow, QGraphicsView - запутался в архитектуре :(
Отправлено: Igors от Январь 02, 2013, 13:15
Я вас понял, спасибо и с наступившим :)
Спасибо, и Вас также  :)

Может лучше сказать так. Вы хотите иметь готовый, заряженный инструментарий - это нормальная, разумная идея. Но сказывается "нехватка задачи", получается "инструментарий для инструментария", и вытекающая из этого запутанность. Мне кажется лучший способ - написать простенькую задачку, и инструментарий будет выучен "сам собой"