2011-10-09 163 views
3

我想通過使用LD_PRELOAD方法捕獲來自我的遊戲的圖像,通過提供我自己的庫文件來攔截OpenGL調用。此方法對於簡單的演示OpenGL代碼非常有用(請參閱this project's文件demo.cpp,make.sh,load.sh),但對於我認爲使用OpenGL的FPS遊戲UrbanTerror不起作用。我自己提供的函數gettimeofday被正確調用,但是我的glXSwapBuffers不是,出於某種原因。這些遊戲是否以不同方式使用OpenGL?如果是這樣,怎麼樣?歡迎任何關於如何掛鉤UrT和/或其他FPS遊戲的提示。我在Ubuntu 11FPS遊戲和OpenGL

Related Question 1

Related Question 2

+0

Urban Terror是開源遊戲。所以,你可以看到並調試它的源代碼。 – frp

+0

http://ftp.snt.utwente.nl/pub/games/urbanterror/iourbanterror/source/complete/ – user423805

回答

6

AFAIK的的Quake3引擎(用於城市恐怖)實現自定義動態OpenGL的裝載系統,即二進制不針對libGL函數鏈接.so直接使用dlopen加載libGL.so,然後使用dlsym檢索所有的OpenGL符號。爲避免與任何直接鏈接的代碼發生衝突,所有內部符號都以「名稱空間」作爲前綴。

然而,LD_PRELOAD環境變量將不起作用。要掛鉤到動態加載的庫,你必須做一些主要的詭計。有幾種可能性。我還建議攔截dlopendlsym的調用,併爲你想要掛鉤的功能,返回你的蹦牀(它將最終調用所請求的函數),而不是直接返回函數指針。

順便說一句:現在你問這個問題很好,因爲我正在編寫一個類似的預加載libGL.so作爲對我正在編寫的窗口合成器的支持;我可能陷入同樣的​​陷阱。