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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: OpenGL, многопоточность  (Прочитано 12007 раз)
Lestat
Гость
« : Ноябрь 30, 2009, 17:09 »

Здравствуйте!
Хотелось бы найти демку с рендером одной сцены OpenGL в разных виджетах...
т.е. расшаривание ресурсов контекста OpenGL

По документации Qt так и не понял ничего... не получается расшарить VBO.
Нашел неплохой тутор, http://www.crossplatform.ru/node/241#writingmultithreadedglapplications
Попытался собрать исходники под Qt 4.6... допилил напильником)
чего-то скомпилилось, но кроме серого опенгл виджета ничего не наблюдаю)

Помогите, если кто с подобным сталкивался.

Интересует возможность загружать VBO и текстуры в отдельном потоке, т.е. рисовать в одном, загружать в другом.
Ну и расшаривание ресурсов (VBO, текстур, шейдеров) между несколькими контекстами.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Не делал этого. Мысли были но не нашел что я буду с этого иметь. Рендерить в др. нитке не очень эффективно пока все данные не загружены. А часто и просто нельзя (напр. с той же прозрачностью). Если карта не держит и/или попадется не thread-safe шейдер или еще что - надо откатываться на одиночный вариант. Все это слишком хлопотно и роль CPU не очень ясна

Вместо этого приспособил glCallLists и получил очень хороший прирост по скорости Улыбающийся
Записан
Lestat
Гость
« Ответ #2 : Декабрь 04, 2009, 15:59 »

Многопоточность кривая, т.к. драйверу фактически нужно передавать последовательность команд, но в некоторых случаях может пригодится!

У меня получилось собрать демку в которой реализуется рендер контекстов OpenGL с расшаренными VBO!

контекст среднего окна создает VBO которые расшариваются на контексты мелких окон.
Цветной квадратик на скрине это как раз расшаренные ресурсы... его вершины, индексы и цвет лежат в расшаренных буфферах!

Теперь хотелось бы сделать поток, в котором можно выполнять какие-нибудь операции над расшаренными VBO...

слить демку можно тут Qt_OpenGL_multiwindow.rar

Файл проекта для Visual Studio лежит в папке ./build/msvs/
для QtCreator в ./build/QtCreator/
« Последнее редактирование: Декабрь 04, 2009, 16:12 от Lestat » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 05, 2009, 14:00 »

Это немного не в тему, но, по-моему, интересно. Вы дали в углах чистые цвета: red, green, blue, black - а почему раскрашено не симметрично, какая-то зеленая диагональ?

Я понимаю, OGL так делает, но почему?

Спасибо
Записан
Lestat
Гость
« Ответ #4 : Декабрь 05, 2009, 14:39 »

потому что получается на самом деле это два треугольника... рисуется через GL_TRIANGLE_STRIP
и чистые цвета на углах этих самых двух треугольников, вот и получается градиент с зеленого на черный по длинным сторонам этих треугольников
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 05, 2009, 14:46 »

потому что получается на самом деле это два треугольника... рисуется через GL_TRIANGLE_STRIP
и чистые цвета на углах этих самых двух треугольников, вот и получается градиент с зеленого на черный по длинным сторонам этих треугольников
Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Декабрь 05, 2009, 18:49 »

Цитировать
Не делал этого. Мысли были но не нашел что я буду с этого иметь.

Экономию памяти в 2 раза по идее - например при реализации кабины автомобиля - лобового и бокового стекла - при рендере с расшаренными ресурсами вместо запуска 2-х копий рендера у которого все ресурсы будут свои и повторяющиеся...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 05, 2009, 19:05 »

Цитировать
Не делал этого. Мысли были но не нашел что я буду с этого иметь.

Экономию памяти в 2 раза по идее - например при реализации кабины автомобиля - лобового и бокового стекла - при рендере с расшаренными ресурсами вместо запуска 2-х копий рендера у которого все ресурсы будут свои и повторяющиеся...
Для этого есть glCallLists - очень удачное решение если нужны различные виды одной сцены.
Записан
Lestat
Гость
« Ответ #8 : Декабрь 05, 2009, 20:10 »

Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?
Можно сгенерировать текстуру с нужной интерполяцией на CPU, можно и с шейдерами поковыряться...
давно находил демки, уроки с созданием процедурных текстур

Для этого есть glCallLists - очень удачное решение если нужны различные виды одной сцены.

так ресурсы все равно нужно уметь расшарить для разных контекстов...
Разве glCallLists из разных контекстов будут видеть одни и те же листы? В этом я очень сильно сомневаюсь...
Текстуры тоже нужно расшаривать... кстати, glCallLists устаревшее решение, насколько я знаю на данный момент рекомендуется использовать VBO и вроде бы уже даже VAO, но VAO на практике я не юзал
« Последнее редактирование: Декабрь 05, 2009, 20:14 от Lestat » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 05, 2009, 21:10 »

Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?
Можно сгенерировать текстуру с нужной интерполяцией на CPU, можно и с шейдерами поковыряться...
давно находил демки, уроки с созданием процедурных текстур
Понятно, вижу что такие задачи в Ваш круг интересов не входят. Это нормально, каждому свое
Записан
xop
Гость
« Ответ #10 : Декабрь 12, 2009, 18:04 »

Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?

Можно, варианты - либо своя текстура (как писали выше), либо через геометрический шейдер, реализующий специальную интерполяцию (пример есть в cg toolkit от nvidia).

По основной теме - расшаривать ресурсы можно и нужно, но рендерить все лучше из одного потока, особенно если физически GPU один. Пробовал работать с несколькими контекстами из разных потоков (причем даже не для рендера, а просто для фоновой подгрузки данных) - огреб по полной программе, то ли из-за драйвера, то ли у меня руки кривые Улыбающийся

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


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