2011-10-09 128 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作为对我正在编写的窗口合成器的支持;我可能陷入同样的​​陷阱。