Название: 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-х копий рендера у которого все ресурсы будут свои и повторяющиеся... Название: 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 один. Пробовал работать с несколькими контекстами из разных потоков (причем даже не для рендера, а просто для фоновой подгрузки данных) - огреб по полной программе, то ли из-за драйвера, то ли у меня руки кривые :) Насчет многопоточной оптимизации рендера - есть еще вариант - подготавливать свой список команд на рендер (когда объектов в сцене много - это может быть не такой быстрой задачей) в другом потоке (или даже потоках), и потом этот буфер передавать в основной поток рендера и там эти команды выполнять. Слышал, что можно получить хороший выигрыш, но сам не пробовал. |