簡體   English   中英

使用 OpenGL 繪制到另一個應用程序窗口

[英]Draw to another application window with OpenGL

在我的程序中,我必須運行另一個應用程序(它用 OpenGL 繪制一些東西),並在其中繪制。

如何在 Windows 或 Qt 中執行此操作?

帶有解決方案的文章,可以在這里找到。

在 Windows 中只使用非常晦澀和骯臟的黑客。 我不推薦它。 Qt 只是一個框架,它取決於底層操作系統。 在 Windows 上,Windows 的所有約束都適用。

在 X11 上,您可以以兩種模式創建 OpenGL 上下文:直接間接(請參閱 glXCreateContext 和 glXCreateNewContext 的直接參數)。 X 客戶端之間可以共享間接上下文,因為對於 X 服務器而言,沒有進程或不同的客戶端。 只有 XID,OpenGL 上下文就是其中之一。 這允許您在連接到同一 X 顯示器的進程之間傳遞間接 OpenGL 上下文的 XID。 但是,直接上下文繞過 GLX 協議,因此無法共享。

運行另一個應用程序(用 OpenGl 繪制),並在其中繪制。

獲取此程序(通過opengl)繪制的圖像,將其用作紋理,進行一些變換並替換原始圖像。

這是兩件相當不同的事情。 根據進一步的說明,“最簡單”和“最干凈”的方式(如果你可以這樣稱呼的話)做你顯然想要的事情是鈎住wglSwapLayerBuffers (這似乎是SwapBufferswglSwapBuffers內部調用的,你我需要確認或鈎住所有三個)。

然后,您擁有一個有效的上下文句柄,並且在交換緩沖區時,您確定(必須!)幀緩沖區內容有效且一致,不存在半繪制的原語。 因此,沒有什么可以阻止您讀回前端或后端緩沖區(或兩者!),在其上運行一些內核,並在將控制權返回給應用程序之前將其寫回。

由於上下文句柄僅對進程有效,因此可靠地工作而沒有麻煩且沒有一些真正討厭的黑客(比這已經更討厭)的唯一方法是插入一個假的opengl32.dll ,就像 GLIntercept 之類的工具所做的那樣。
您也可以從迷你調試器“竊取”句柄,但它對您的進程無效,因此沒有用。

但是……就像 datenwolf 說的:不要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM