glext.h的问题

时间:2011-08-09 09:15:34

标签: windows linux macos opengl osx-lion

当我找到something that now has me scared to use glext.h时,我正在浏览OS X Lion上的OpenGL更新。

所以,这是错误。 Lion的OpenGL.framework有glext.h,其定义如下。

typedef void *GLhandleARB;

但OpenGL注册表中的glext.h代替了以下内容。

typedef unsigned int GLhandleARB;

现在,麻烦的是,在Lion上为x86_64构建时,我们有sizeof(void*)==8,但是sizeof(unsigned int)==4。那么你信任什么?狮子头?还是OpenGL注册表的标题?好吧,当然你信任系统头文件,因为显然他们声称知道64位Lion上的ABI有64位GLhandleARB类型。

现在,这引发了一些关于各种平台的问题:

  1. 如果您必须使用Apple的glext.h,但Apple的glext.h不能提供对OpenGL 2.1之后的任何访问权限,那么您如何获得3.0 +新卡上的功能?

  2. 在Linux上使用OpenGL注册表glext.h是不安全的吗?或者你必须在那里使用系统的glext.h吗?在这种情况下,问题#1也适用于此。

  3. 你如何处理Windows上的问题,系统上从不 glext.h?您显然无法使用驱动程序供应商的glext.h,因为不同的供应商可能不同意各种类型的大小。 (或者这不是真的吗?)这里的交易是什么?

2 个答案:

答案 0 :(得分:2)

我认为没问题。 只需使用OS /驱动程序提供的标题。 或者更好地使用多平台OpenGL扩展加载器,这将为您提供帮助。 (例如GLEW

另一方面,在代码中你只使用GLhandleARB,而不是其他东西,所以在Mac上它将是无效的* - 没问题,在Linux上 - 不同的东西 - 没有问题,在带有AMD标题的Linux上 - 完全不同的东西 - 没问题。

源代码可以跨不同平台移植,而不是二进制文件,因此我认为没有问题。

1)如果您使用Apple提供的版本,则无法获得更好的OpenGL。所以目前你可以在10.7上获得最大的OpenGL 3.2核心配置文件。 (听说Nvidia在某些gpus上用自己的标题用OpenGL 3.3绕过它,但是我自己也无法检查它。)

2)这取决于。如果你的目标是OpenGL 2.1及以下,开源驱动程序支持它,但只有专有驱动程序支持更高版本,所以你应该使用它们的标题。 但是在代码中你只需要输入“#include”,然后链接到适当的标题和.so库。

3)不知道Win上的情况如何。但是供应商可能会使用OpenGL注册表中的glext。

但所有这些都是基于错误的假设。你不必知道他们的答案。只需使用已经知道如何处理这种负担的软件。 (例如GLEW)。

答案 1 :(得分:0)

您应该使用官方OpenGL函数来获取您运行的OpenGL实例所支持的扩展:glGetString(GL_EXTENSIONS)

至于你应该使用哪种类型,我认为已经回答了Apple的邮件列表:http://lists.apple.com/archives/mac-opengl/2005/Nov/msg00182.html

  

两者;该规范没有对GLhandleARB是什么做出任何声明,   除此之外,它至少有32位宽。请注意,在OpenGL中   2.0着色语言API没有GLhandle类型,它使用GLuint   像纹理。另请注意,GLuint在Mac OS上不是unsigned int   X,这是一个无符号的长,所以你仍然被搞砸了:)