Загрузка текстур с резьбой OpenGL с помощью Qt 4.5 / 4.6 - PullRequest
2 голосов
/ 22 января 2010

Я пытаюсь разработать приложение для карт для научных целей в моем университете. Для этого я получил доступ ко множеству плиток (256х256). Я могу получить к ним доступ и сохранить их в QImage в отдельном QThread. Моя проблема в том, как мне на самом деле удается загрузить QImage в текстуру внутри отдельного QThread (не основного потока GUI)? Или еще лучше дайте мне Типп, как подойти к этой проблеме.

Я думаю о многопоточном OpenGL, но мне также требуется выбор OpenGL, и я не упал ни на что полезное.

Укажите на любой полезный пример кода, если хотите, я благодарен за все, что компилируется в Linux:)

Примечание 1: Я использую рендеринг на основе событий, поэтому, только если сцена меняется, она перерисовывается. Примечание 2: OSG НЕ является опцией, для этой цели она слишком сложна, необходим легкий подход. Примечание 3: Приложение полностью написано на C ++

Спасибо за любой ответ. Постскриптум наберитесь терпения, я не настолько продвинут, как эта тема может (или не может) предлагать.

Ответы [ 2 ]

2 голосов
/ 22 января 2010

OpenGL не является поточно-ориентированным. Вы можете использовать только один контекст GL в одном потоке одновременно. В зависимости от ОС вы также должны отказаться от дескриптора контекста в одном потоке, чтобы использовать его в другом.

Вы не можете ускорить загрузку текстур за счет многопоточности, поскольку узким местом здесь является пропускная способность видеокарты.

Пусть ваши потоки доставки, которые загружают плитки, заполняют кольцевой буфер. Поток GL подается из кольцевого буфера. С двумя мьютексами легко управлять кольцевым буфером, чтобы сделать эту поточно-ориентированную операцию.

Это было бы моим предложением.

1 голос
/ 16 мая 2011

Два трюка, которые я использую, чтобы ускорить процесс:

  • пиксельные буферные объекты: отображать память графического процессора, чтобы поток загрузки мог писать напрямую в gpu;
  • объекты синхронизации: с объектом синхронизации я знаю, когда текстура действительно готова к использованию (glTexImage2D с PBO является асинхронным, поэтому нет гарантии, что текстура готова к связыванию, т. Е. При связывании текстуры она блокируется, если DMA не закончил обновление данных текстуры)
...