Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Lestat от Ноябрь 30, 2009, 17:09



Название: OpenGL, многопоточность
Отправлено: Lestat от Ноябрь 30, 2009, 17:09
Здравствуйте!
Хотелось бы найти демку с рендером одной сцены OpenGL в разных виджетах...
т.е. расшаривание ресурсов контекста OpenGL

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

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

Интересует возможность загружать VBO и текстуры в отдельном потоке, т.е. рисовать в одном, загружать в другом.
Ну и расшаривание ресурсов (VBO, текстур, шейдеров) между несколькими контекстами.


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

Вместо этого приспособил glCallLists и получил очень хороший прирост по скорости :)


Название: Re: OpenGL, многопоточность
Отправлено: Lestat от Декабрь 04, 2009, 15:59
Многопоточность кривая, т.к. драйверу фактически нужно передавать последовательность команд, но в некоторых случаях может пригодится!

У меня получилось собрать демку в которой реализуется рендер контекстов OpenGL с расшаренными VBO!
(http://img252.imageshack.us/img252/9272/screenrj.png)
контекст среднего окна создает VBO которые расшариваются на контексты мелких окон.
Цветной квадратик на скрине это как раз расшаренные ресурсы... его вершины, индексы и цвет лежат в расшаренных буфферах!

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

слить демку можно тут Qt_OpenGL_multiwindow.rar (http://narod.ru/disk/15654598000/Qt_OpenGL_multiwindow.rar.html)

Файл проекта для Visual Studio лежит в папке ./build/msvs/
для QtCreator в ./build/QtCreator/


Название: Re: OpenGL, многопоточность
Отправлено: Igors от Декабрь 05, 2009, 14:00
Это немного не в тему, но, по-моему, интересно. Вы дали в углах чистые цвета: red, green, blue, black - а почему раскрашено не симметрично, какая-то зеленая диагональ?

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

Спасибо


Название: Re: OpenGL, многопоточность
Отправлено: Lestat от Декабрь 05, 2009, 14:39
потому что получается на самом деле это два треугольника... рисуется через GL_TRIANGLE_STRIP
и чистые цвета на углах этих самых двух треугольников, вот и получается градиент с зеленого на черный по длинным сторонам этих треугольников


Название: Re: OpenGL, многопоточность
Отправлено: Igors от Декабрь 05, 2009, 14:46
потому что получается на самом деле это два треугольника... рисуется через GL_TRIANGLE_STRIP
и чистые цвета на углах этих самых двух треугольников, вот и получается градиент с зеленого на черный по длинным сторонам этих треугольников
Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?


Название: Re: OpenGL, многопоточность
Отправлено: break от Декабрь 05, 2009, 18:49
Цитировать
Не делал этого. Мысли были но не нашел что я буду с этого иметь.

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


Название: Re: OpenGL, многопоточность
Отправлено: Igors от Декабрь 05, 2009, 19:05
Цитировать
Не делал этого. Мысли были но не нашел что я буду с этого иметь.

Экономию памяти в 2 раза по идее - например при реализации кабины автомобиля - лобового и бокового стекла - при рендере с расшаренными ресурсами вместо запуска 2-х копий рендера у которого все ресурсы будут свои и повторяющиеся...
Для этого есть glCallLists - очень удачное решение если нужны различные виды одной сцены.


Название: Re: OpenGL, многопоточность
Отправлено: Lestat от Декабрь 05, 2009, 20:10
Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?
Можно сгенерировать текстуру с нужной интерполяцией на CPU, можно и с шейдерами поковыряться...
давно находил демки, уроки с созданием процедурных текстур

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

так ресурсы все равно нужно уметь расшарить для разных контекстов...
Разве glCallLists из разных контекстов будут видеть одни и те же листы? В этом я очень сильно сомневаюсь...
Текстуры тоже нужно расшаривать... кстати, glCallLists устаревшее решение, насколько я знаю на данный момент рекомендуется использовать VBO и вроде бы уже даже VAO, но VAO на практике я не юзал


Название: Re: OpenGL, многопоточность
Отправлено: Igors от Декабрь 05, 2009, 21:10
Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?
Можно сгенерировать текстуру с нужной интерполяцией на CPU, можно и с шейдерами поковыряться...
давно находил демки, уроки с созданием процедурных текстур
Понятно, вижу что такие задачи в Ваш круг интересов не входят. Это нормально, каждому свое


Название: Re: OpenGL, многопоточность
Отправлено: xop от Декабрь 12, 2009, 18:04
Спасибо, ясно. А можно ли закрасить лучше (напр. написать шейдер который будет плавно интерполировать) для 4-х угольника? Какой алгоритм?

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

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

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