为什么在Doom 3源代码中所有OpenGL函数调用都以“ q”为前缀?


42

为什么在《毁灭战士3》源代码中每个OpenGL调用都以“ q”为前缀?它们是自定义函数还是其他库,如果是,为什么在OpenGL上使用它?任何Google搜索都带有Qt OpenGL模块,我认为这与它无关。

Answers:


62

作为参考- 毁灭战士的qgl.h

OpenGL是一个奇怪的小API。因为标准实现缺少新功能,或者因为要使用扩展,您必须经常使用函数指针。例如,如果您要调用glCreateShader,但是您所开发的操作系统没有附带足够新的GL标头,则必须使用glGetProcAddress("CreateShader")以便从用户驱动程序中加载功能。然后,您必须将该函数指针存储在某个位置。

即使您的开发环境具有特定功能,用户的计算机也可能没有。然后某个功能可以2-3种形式出现(供应商扩展,ARB扩展,核心功能),因此您可能必须使用几种不同的名称来搜索功能。

许多GL“加载程序”库(例如GLEW)都尝试遵循 GL约定。他们使用通常的gl-prefix 创建“假”函数,并尝试神奇地使您的代码在支持必要功能的任何OS或驱动程序上都能正常工作。本质上,而不是glFoo作为一个实际的功能,它只是一个全局函数指针和装载库(初始化或第一次使用时)搜索FooEXTFooARB以及Foo直到找到一个实现,然后转让,为全局指针。客户端代码看起来就像是在调用一个常规函数,但是神奇的是,在初始化过程中,它们在运行时都可以解决所有不同平台和驱动程序的问题。

其他库将函数放在名称空间中,或者与GL规范略有不同。ID写自己的装载机,要么是因为他们不喜欢这样或存在的那些-更容易-雷神之锤只是早于任何其他库,ID也可以使用(在qqgl可能代表地震,这是第一个ID技术的游戏使用GL)。

编写GL规范是有可能的。该规范没有前缀。这是OpenGL的实现,它决定使用哪个前缀(gl当然是常用的前缀)。将函数放入名称空间或使用其自己的前缀的加载程序库是完全有效的。

基于Quake引擎的Doom 3是完全典型的,在使用加载程序库处理多个平台上的GL奇数以及选择使用qgl前缀方面是完全合理的。


+1,以及发现的荣誉我写的id不好(您完全正确的大写),尽管在我能找到的所有资源中,en.wikipedia.org / wiki / Id_Tech仍然写有空格。
vaxquis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.