顶点数组对象 - OSX 上的 glGenVertexArrays GL_INVALID_OPERATION

zac*_*caj 1 opengl macos opengl-3 swift

我正在尝试运行一个简单的 OpenGL 程序,但无法让它显示任何内容。我在 Mac 上使用 Swift,尽管我对 Windows 上的 OpenGL 拥有丰富的经验,但我对这两者都不熟悉。程序运行良好(没有 GL 错误或任何内容),但没有任何显示,直到我在 openGL 初始化结束时添加此内容:

var vao:GLuint=0;checkGlError();
glGenVertexArrays(1, &vao);checkGlError();
glBindVertexArray(vao);checkGlError();
Run Code Online (Sandbox Code Playgroud)

然后,一旦我调用 glGenVertexArrays(),它就会给出 GL_INVALID_OPERATION,但是文档没有提到这一点。

我担心我可能没有 GL3 上下文(实际上我更喜欢只有 GL1/2 上下文,但是 Swift 标头似乎缺少像 glBegin() 和 glColor3f() 这样的东西,所以我决定满足于GL3),所以我尝试手动请求一个:

required init?(coder: NSCoder) {
    super.init(coder: coder);
    let attribs=[NSOpenGLPFAOpenGLProfile,NSOpenGLProfileVersion3_2Core,0];
    pixelFormat=NSOpenGLPixelFormat(attributes: UnsafePointer<NSOpenGLPixelFormatAttribute>(attribs));
    openGLContext=NSOpenGLContext(format: pixelFormat, shareContext: nil);
    openGLContext.view=self;
    openGLContext.makeCurrentContext();
};
Run Code Online (Sandbox Code Playgroud)

然而,这似乎根本没有影响事情。

And*_*man 5

首先,glBegin (...)在核心配置文件上下文中无效。为此,您将需要一个遗留(非核心)上下文。

现在,由于遗留上下文仅限于 OpenGL 2.1,因此它仅提供GL_APPLE_vertex_array_object. 在 2.1 上下文中,您可以调用glGenVertexArraysAPPLE (...)andglBindVertexArrayAPPLE (...)他们会做同样的事情。

您遇到的问题是,在 OS X 上,无论您获得哪个上下文版本,都链接到相同的框架。这意味着您可以在运行时调用上下文不支持的函数。每当您尝试使用遗留上下文中的 GL 3.2+ 函数时,您都会得到GL_INVALID_OPERATION.