我只是在浏览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位的GLhandleARB
types。
现在,在我看来,这引发了一些关于各种平台的问题:
如果你必须使用苹果公司的glext.h
,但是苹果的glext.h
不能提供比OpenGL 2.1更高的访问速度,那么你如何获得更新卡上的3.0+function呢?
在Linux上使用OpenGLregistryglext.h
不安全吗? 或者你也必须在那里使用系统的glext.h
? 在这种情况下,问题#1也适用于此处。
你是怎么处理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上的一个无符号整数,它是一个无符号长整数,所以你仍然被搞砸了:)