Рисовать в другое окно приложения с помощью OpenGL - PullRequest
0 голосов
/ 16 февраля 2012

В моей программе мне нужно запустить другое приложение (которое рисует что-то с помощью OpenGL) и нарисовать в нем.

Как это сделать в Windows или с помощью Qt?

Статью с решением, можно найти здесь .

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

запустите другое приложение (которое рисует что-то с помощью OpenGl) и нарисуйте его.

получите изображение, нарисованное этой программой (с помощью opengl), используйте его в качестве текстуры, сделайте некоторое преобразование изаменить исходное изображение.

Это две довольно разные вещи.«Самый простой» и «самый чистый» способ (если это вообще можно так назвать) сделать то, что вы, очевидно, хотите, в соответствии с дальнейшими разъяснениями, - это перехватить wglSwapLayerBuffers (который кажется чемSwapBuffers и wglSwapBuffers вызовите внутри страны, вам нужно подтвердить это или перехватить все три).

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

Поскольку дескриптор контекста действителен только дляпроцесс, единственный способ, который надежно работает без проблем и без некоторых действительно неприятных хаков (более неприятных, чем это уже есть), - это вставка поддельного opengl32.dll, во многом как инструменты, такие как GLIntercept.
Возможно, вы могли бы также «украсть» дескриптор из мини-отладчика, но он не будет действителен для вашего процесса, поэтому бесполезен.

Но ... как сказал datenwolf: просто несделай это.

0 голосов
/ 16 февраля 2012

В Windows используются только очень неясные и грязные хаки. Я не рекомендую это. Qt - это просто фреймворк, который зависит от используемой ОС. В Windows применяются все ограничения Windows.

В X11 вы можете создавать контексты OpenGL в двух режимах: прямой или косвенный (см. Параметр direct в glXCreateContext и glXCreateNewContext). Косвенные контексты могут быть разделены между X-клиентами, потому что для X-сервера нет процессов или отдельных клиентов. Есть только XID, одним из которых является контекст OpenGL. Это позволяет передавать XID косвенного контекста OpenGL между процессами, подключенными к одному дисплею X. Прямой контекст обходит протокол GLX и, следовательно, не может использоваться совместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...