MacOS X:glGenFramebuffers()的意外行为

MacOS X:glGenFramebuffers()的意外行为,c,macos,opengl,C,Macos,Opengl,我正在做一个OpenGL学习练习,其中包括使用glGenFramebuffers()。然而,当我调用该函数时,似乎什么都没有发生。我创建了以下简单程序来重现该问题: #define GL_GLEXT_PROTOTYPES #include <stdio.h> #include <GL/gl.h> #include <GL/glext.h> static GLuint fb[2]; int main(void) { glGenFramebuffers

我正在做一个OpenGL学习练习,其中包括使用glGenFramebuffers()。然而,当我调用该函数时,似乎什么都没有发生。我创建了以下简单程序来重现该问题:

#define GL_GLEXT_PROTOTYPES
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glext.h>

static GLuint fb[2];

int main(void)
{
    glGenFramebuffers(2, fb);
    printf("result: %u %u\n", fb[0], fb[1]);
    return 0;
}
输出:

2.1 NVIDIA-7.32.12
0 0

MacOS X 10.7.5

英伟达GeForce 320M 256 MB

$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)

glGetString(GL_版本):2.1 NVIDIA-7.32.12

您需要一个OpenGL上下文,但不创建它。

您需要一个OpenGL上下文,但不创建它。

FBO是OpenGL 3.0+中唯一的核心。你得到了一个2.1的上下文


要获得支持,请使用
glGenFramebuffersEXT()

FBO是OpenGL 3.0+中唯一的核心。你得到了一个2.1的上下文


要获得支持,请使用
glGenFramebuffersEXT()

在调用该函数后检查
glGetError(…)
的值。在2.1环境中,很可能是
GL\u无效\u操作。您可以从OS x上的GL 2.1上下文调用GL 3.x函数,但它们始终会生成
GL\u INVALID\u操作

这种情况与大多数其他平台完全不同,后者在运行时设置函数指针。在OSX上,无论您是拥有GL 2.1上下文还是GL 3.2+核心,您都可以链接到同一个库,其中包含适用于Apple实现的每个GL版本的函数。这允许您调用上下文版本中未实现的函数。但是,任何调用这些函数的尝试都不会在运行时产生任何效果,除非设置
GL\u INVALID\u OPERATION

要解决这个问题,您需要使用FBO的
EXT
形式,或者获得一个3.2+核心上下文。由于在OSX上使用X11无法完成后续操作,因此您可能必须使用扩展。我应该澄清一下,当我说使用FBO的扩展形式时,OSX上的所有这些实际上都在用
glGenFramebuffers(…)
替换
glGenFramebuffersEXT(…)
。您不必调用任何
*GetProcAddress(…)
函数


或者,您可以使用SDL或GLFW3之类的框架,或者从X11/GLX移动到NSOpenGL(Obj-C)或CGL(C/C++)。在OS X上使用本机接口而不是像AGL或X11/GLX这样不推荐的东西是获得3.2内核上下文的唯一方法。

调用该函数后检查
glGetError(…)
的值。在2.1环境中,很可能是
GL\u无效\u操作。您可以从OS x上的GL 2.1上下文调用GL 3.x函数,但它们始终会生成
GL\u INVALID\u操作

这种情况与大多数其他平台完全不同,后者在运行时设置函数指针。在OSX上,无论您是拥有GL 2.1上下文还是GL 3.2+核心,您都可以链接到同一个库,其中包含适用于Apple实现的每个GL版本的函数。这允许您调用上下文版本中未实现的函数。但是,任何调用这些函数的尝试都不会在运行时产生任何效果,除非设置
GL\u INVALID\u OPERATION

要解决这个问题,您需要使用FBO的
EXT
形式,或者获得一个3.2+核心上下文。由于在OSX上使用X11无法完成后续操作,因此您可能必须使用扩展。我应该澄清一下,当我说使用FBO的扩展形式时,OSX上的所有这些实际上都在用
glGenFramebuffers(…)
替换
glGenFramebuffersEXT(…)
。您不必调用任何
*GetProcAddress(…)
函数


或者,您可以使用SDL或GLFW3之类的框架,或者从X11/GLX移动到NSOpenGL(Obj-C)或CGL(C/C++)。在OS X上使用本机接口而不是像AGL或X11/GLX这样不推荐的东西是获得3.2内核上下文的唯一方法。

glGetError()的可能重复实际上返回0,但是在我更改代码以使用*EXT函数之后,一切都开始工作:)OSX处理opengl版本的方式非常奇怪。我预计会出现编译错误,但库在运行时会悄无声息地失败。通常情况下,在OS X上处理得相当优雅。如果使用OpenGL框架和include,它只包含2.1上下文提供的函数。您必须使用从core 3.2+获取函数定义、typedef和常量。但是,由于您使用的是X11/GLX/Mesa,而不是普通的OpenGL框架,因此它的行为方式并非如此。我希望能够在Linux上运行相同的代码,因此我决定这样做。如果出于任何原因不需要直接与X接口,我建议使用类似GLFW的东西。您可以使用GLFW在OS X上获得核心OpenGL 3.2上下文,而无需编写一段目标C代码,而且它具有高度的可移植性。通常,您必须编写Obj-C代码才能使用NSOpenGL(OSX上首选的本机GL接口,也是唯一允许您绘制到窗口而不是全屏的接口)。X11(XQuartz)已被弃用,仅出于兼容性目的提供。glGetError()实际上返回0,但在我更改代码以使用*EXT函数并开始工作后:)OS X处理opengl版本的方式非常奇怪。我预计会出现编译错误,但库在运行时会悄无声息地失败。通常情况下,在OS X上处理得相当优雅。如果使用OpenGL框架和include,它只包含2.1上下文提供的函数。您必须使用从core 3.2+获取函数定义、typedef和常量。但是,由于您使用的是X11/GLX/Mesa,而不是普通的OpenGL框架,因此它的行为方式并非如此。我希望能够在Linux上运行相同的代码,因此我决定这样做。如果出于任何原因不需要直接与X接口,我建议使用类似GLFW的东西。使用GLFW,您可以在OS X上获得核心OpenGL 3.2上下文,而无需编写一段目标C代码,而且它非常高
$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)