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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Использование QOpenGLBuffer  (Прочитано 28924 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Ноябрь 15, 2016, 15:43 »

Или можно хранить копии одного объекта с разной детализацией? Тогда достаточно в момент рендеринга выбирать нужный вид.
Почти так - только хранить "деталированные копии" как QOpenGLBuffer(s). Каждый уровень детализации увеличивает объем геометрии в 4 раза. Вот и надо сделать чтобы это было не накладно, пусть с этим видео разбирается
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Ноябрь 17, 2016, 11:09 »

Ну вот опять недоумение/молчание  Улыбающийся Возможно товарищей смутило мое самопальное "сохранить модель на видео". Но это и сейчас делает всякий/каждый. Псевдокод
Код
C++ (Qt)
struct CObjectGL {
TVerArray  m_vertex, m_normal .... // контейнеры вертексов, нормалей еще др данных рисования
TIndArray m_index;     // контейнер индексов
 
QOpenGLBuffer m_buf_vertex, m_buf_normal ... // буфера вертексов и др
QOpenGLBuffer m_buf_index;  // буфер индексов
};
Пример заполнения одного буфера, остальные аналогично
Код
C++ (Qt)
m_buf_vertex.bind();
m_buf_vertex.allocate(&m_vertex[0], m_vertex.size() * sizeof(QVertor3D));
m_buf_vertex.release();
Все, данные полетели на видео, остается подать их рисованию. Если нет никаких др целей то можно даже избавиться от исходных данных, напр m_vertex.cl;ear() - рисовать все равно будет.

Теперь надо сделать то же самое но с учетом всяких shared как рассказано выше
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #17 : Ноябрь 17, 2016, 13:32 »

Не совсем понятно. Вы хотите на карте хранить все степени детализации? Тогда это делается использованием разных буферов. Самое простое сделать массив буферов.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Ноябрь 17, 2016, 15:30 »

Не совсем понятно. Вы хотите на карте хранить все степени детализации?
Нет, хранить только текущую. Но с учетом того что буфера могут шариться любым кол-вом объектов
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #19 : Ноябрь 18, 2016, 10:21 »

Имхо, объект должен предоставлять данные по используемым общим вершинам (индексы), которые будут зависить от степени детализации. При смене детализации объекта должна производиться реаллокация буфера.

В моём проекте объект обладает рисовальщиком, который отвечает за реаллокацию при изменении объекта и за отрисовку объекта.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Ноябрь 18, 2016, 12:01 »

Имхо, объект должен предоставлять данные по используемым общим вершинам (индексы), которые будут зависить от степени детализации. При смене детализации объекта должна производиться реаллокация буфера.
Есть 2 объекта шарящие буфер(а). Теперь деталировка первого объекта изменилась, второго нет. Ваши действия?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #21 : Ноябрь 18, 2016, 12:17 »

При изменении деталировки первого объекта необходимо реаллоцировать его буфер индексами вершин, которые описывают модель более подробно.
Перерисовать объекты.

Или у вас нет возможности использовать вершины самой подробной модели для вывода грубой?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Ноябрь 18, 2016, 13:15 »

При изменении деталировки первого объекта необходимо реаллоцировать его буфер индексами вершин, которые описывают модель более подробно.
Перерисовать объекты.

Или у вас нет возможности использовать вершины самой подробной модели для вывода грубой?
Откуда Вы вообще это взяли Непонимающий Буфер(а) объектов с разной деталировкой не имеют между собой ничего общего. Конечно при выполнении детализации должны быть созданы все новые буфера (не только для индексов). Вопрос где и как их хранить учитывая возможный share.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #23 : Ноябрь 18, 2016, 13:22 »

Есть 2 объекта шарящие буфер(а). Теперь деталировка первого объекта изменилась, второго нет. Ваши действия?

Клонировать данные отрисовки. Ну или шейдерами, гада)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Ноябрь 18, 2016, 13:28 »

Клонировать данные отрисовки.
Can you please be more specific?
Ну или шейдерами, гада)
Почему "или"? Только 1 буфер подается в glDrawElements, все остальные - в пресловутые шейдеры
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #25 : Ноябрь 18, 2016, 13:54 »

Почему "или"? Только 1 буфер подается в glDrawElements, все остальные - в пресловутые шейдеры
Что-то тут не то, кажется, написано.

Цитировать
Конечно при выполнении детализации должны быть созданы все новые буфера
Я представляю, что у вас есть облака точек для каждой детализации. Каждый ваш объект имеет набор индексов точек для формирования полигонов в той или иной детализации. Предполагаю, что у вас слабодетализированное облако пересекается высокодетализированным не полностью. Предполагаю, что большая часть точек из слабодетализированного облака совпадает с некоторыми точками из высокодеталлизированного. Предлагаю слить все облака в единый общий буфер при этом ликвидируя дубликаты точек. Полигоны объекта переиндексировать относительно общего облака. Таким образом, используя 1 вершинный буфер можно будет выводить объекты с разной степенью детализации.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Ноябрь 18, 2016, 16:14 »

Я представляю, что у вас есть облака точек для каждой детализации. Каждый ваш объект имеет набор индексов точек для формирования полигонов в той или иной детализации. Предполагаю, что у вас слабодетализированное облако пересекается высокодетализированным не полностью. Предполагаю, что большая часть точек из слабодетализированного облака совпадает с некоторыми точками из высокодеталлизированного.
Не совпадает, см картинку стартового поста  

Предлагаю слить все облака в единый общий буфер при этом ликвидируя дубликаты точек. Полигоны объекта переиндексировать относительно общего облака. Таким образом, используя 1 вершинный буфер можно будет выводить объекты с разной степенью детализации.
Утопия. Я спрашиваю о гораздо более простой/прозаической вещи. Попробуем идти по пути наименьшего сопротивления
Код
C++ (Qt)
struct CRenderObject {
...
QSharedPointer<QOpenGLBuffer> m_buf_ver;
..
};
Изначально уровень деталировки ноль. Хорошо, заполнили буфер из исходных данных. Копируемые объекты шарят, пока все норм. И вот юзверь поставил деталировку напр 2. Должны ли мы выполнить деталировку (дорогая операция) и перезаписать буфер? Ведь возможно кто-то из шарящих уже это сделал, и нужный буфер уже имеется
« Последнее редактирование: Ноябрь 18, 2016, 16:24 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #27 : Ноябрь 18, 2016, 16:34 »

Рядом с буфером храните переменную, характеризующую его детализацию и не надо будет аллоцировать буфер лишний раз.

Я понял, что отмеченные во вложении вершины совпадают.
Можно ещё хранить буферы для используемых детализаций...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Ноябрь 18, 2016, 17:11 »

Рядом с буфером храните переменную, характеризующую его детализацию и не надо будет аллоцировать буфер лишний раз.
Тот же код
Код
C++ (Qt)
struct CRenderObject {
...
QSharedPointer<QOpenGLBuffer> m_buf_ver;
..
};
Деталировка ноль, 2 CRenderObject шарят один буфер. Теперь первому поставили деталировку 1. Ладно, посчитал, сделал m_buf_ver.reset(new QOpenGLBuffer(..)), залил в буфер новые данные. Теперь для второго деталировка тоже 1. Что дает Ваша переменная? Ну был 0 стал 1, это можно узнать и без доп переменной, а толку? Деталировка 1 уже создана для др объекта, ее надо шарить, а не создавать еще раз 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Ноябрь 22, 2016, 16:30 »

Мда, шо-то вообще мЭртво  Улыбающийся Ну наверное это слишком просто и неинтересно. Ладно, чуть усложним

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

Проблема та же что и с буферами - куда эту таблицу приткнуть (где хранить) с учетом разнообразных возможных sharing?
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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