问题与glext.h

我只是在浏览OS X Lion上的OpenGL更新时,发现了一些现在让我害怕使用glext.h

所以,这是错误。 Lion的OpenGL.framework有一个glext.h ,下面的定义。

 typedef void *GLhandleARB; 

但是OpenGLregistry中的glext.h代替下列代码。

 typedef unsigned int GLhandleARB; 

现在,麻烦的是,当在Lion上构buildx86_64时, sizeof(void*)==8 ,而sizeof(unsigned int)==4 。 那么你相信什么? 狮子头? 还是OpenGLregistry头? 那么当然你相信系统头文件,因为显然他们声称知道64位Lion上的ABI有一个64位的GLhandleARBtypes。

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

  1. 如果你必须使用苹果公司的glext.h ,但是苹果的glext.h不能提供比OpenGL 2.1更高的访问速度,那么你如何获得更新卡上的3.0+function呢?

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

  3. 你是怎么处理Windows上的东西的,系统上从来没有 glext.h ? 您显然不能使用驱动程序供应商的glext.h ,因为不同的供应商可能不同意各种types的大小。 (或者这是不正确的?)这里的交易是什么?

我看没问题 只需使用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 )。

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

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

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