簡體   English   中英

從OpenGL應用程序中提取顏色/深度緩沖區

[英]Extract color/depth buffer from OpenGL applications

我在考慮一個安靜的項目,這需要從OpenGL應用程序(尤其是游戲)中提取顏色和深度緩沖區。 從操縱游戲本身或旨在“作弊”的目的而言,它與修改毫無關系,而僅僅是為了收集數據。

因此,現在我正在嘗試找出實現此目標的可能方法。 當然,在Windows下使用Direct3D能夠做到這一點甚至會導致更多可用的應用程序,但是由於我對Linux下的OpenGL非常熟悉,因此我將以這種方式開始。

由於實際上有許多改裝/作弊應用程序可以操縱視頻游戲的不同顏色/深度緩沖區(例如,自我射擊游戲中的牆面駭客),因此看來這肯定是有可能的。

現在的問題是,實現這一目標的最佳方法是什么? 根據該線程 ,直接讀取GPU內存很可能無法正常工作因為OpenGL中的內存映射完全取決於供應商的實現,並且沒有簡單的方法來獲取相應數據的VRAM地址。

我可以想到的替代方法現在可以歸類為靜脈內或靜脈內:

  • Extravenous :從進程中提取OpenGL上下文並從第三個應用程序訪問緩沖區,着色器等,而無需真正地直接操作目標應用程序二進制文件。
  • 靜脈注射 :以這種方式操作目標應用程序的二進制/代碼 ,即將相應的緩沖區/數據寫入內存中的特定位置或直接將其保存在某個位置。

后一種方法肯定可以工作,但是可能需要付出更大的努力,並且需要針對每個應用程序進行。 因此,首先肯定是首選,但是所描述的方法是否完全適用? 當您擁有另一個OpenGL上下文值時,是否可以從不同進程訪問OpenGL資源? 有人對此有經驗嗎?

更新:

經過一番研究,我發現我要找的東西很普通,通常被稱為“ 掛鈎 ”或“攔截”。

對於OpenGL和Direct3D,有許多不同的庫和程序可以做到這一點:

還有很多其他

這樣做的事實上的標准方法是將您自己吸引到過程中,並將應用程序(游戲)進行的圖形API調用重定向到您自己的代碼。 然后,您的鈎子可以記錄所需的任何數據,並在將調用傳遞給實際的API實現之前執行所需的任何操作。 這樣做有很多利弊,從建立具有相同接口的偽造庫並欺騙游戲以加載該庫而不是實際的圖形庫( DLL注入 ),到在加載的過程中修改機器代碼。進行函數調用的圖像跳入您的代碼。 哪種方法適用和最適合您的情況將在很大程度上取決於許多因素,例如目標平台,目標應用程序,您希望使用的API等。

但是,任何這種方法的主要問題在於,這實際上是多少作弊方法。 因此,許多視頻游戲都將帶有內置保護功能,以防止此類事情的發生。 在許多在線游戲中,您甚至可能嘗試進行此類操作,從而冒着涉嫌作弊行為而被暫停帳戶的風險。 但這只是要注意的事情。 以我的經驗,它仍可用於許多游戲,尤其是單人游戲。

“從另一個進程中提取OpenGL上下文”將不起作用,至少在任何適當的操作系統上均不起作用。 首先,將流程抽象的全部目的是將應用程序彼此隔離開...

由於我沒有足夠的聲譽在評論中提出這個問題,因此在這里讓我問您您的確切目標是什么。 您是否想在一幀中獲取一次此信息,還是要在一段時間內記錄多幀? 您是否需要定制應用程序形式的自動化解決方案? 如果兩者都不行,您也許可以僅使用Nsight Graphics之類的圖形調試工具來捕獲和導出所需的幀…

暫無
暫無

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

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