在Mac OSX 10.8.4上使用GLFW3的现代OpenGL - 缺少glGenVertexArrays()和glBindVertexArray()?

时间:2013-11-07 00:14:14

标签: xcode macos opengl

我正在尝试在Xcode 5(Mac OSX 10.8.4)上为我的OpenGL项目设置GLFW3。我已成功安装并将我的项目链接到GLFW3没问题。我甚至在项目中成功创建了一个窗口,我能够通过窗口检测鼠标和键盘输入,所以我相信我正确地连接了GLFW3(或者至少看起来如此)。

但是,当我尝试绘制对象时出现问题。这是出现错误的代码片段:

#include <GLFW/glfw3.h>    

void LoadObject()
{
    glGenVertexArrays(1, &VAO_myObj); // ERROR : Use of undeclared identifier 'glGenVertexArrays'
    glBindVertexArray(VAO_myObj);     // ERROR : Use of undeclared identifier 'glBindVertexArray'


    glGenBuffers(1, &VBO_myObj);                // No error
    glBindBuffer(GL_ARRAY_BUFFER, VBO_myObj);   // No error

    glBufferData(blah blah blah);      // No error

    glEnableVertexAttribArray(0);      // No error
    glVertexAttribPointer(blah);       // No error


    glBindBuffer(GL_ARRAY_BUFFER, 0);  // No error
    glBindVertexArray(0);              // ERROR : Use of undeclared identifier 'glBindVertexArray'
}

所以,这让我相信GLFW3无法以某种方式链接到那些功能(?)。当我向Xcode键入“glGen ...”时,我只在弹出窗口中看到以下4个函数:

void glGenBuffers(GLsizei n, GLuint * buffers)
GLuint glGenLists(GLsizei range)
void glGenQueries(GLsizei n, GLuint * ids)
void glGenTextures(GLsizei n, GLuint * textures)

所以,很可能glgenVertexArrays()确实从库中丢失了。

同样对于“glBind ...”,当我输入Xcode的名称时,只有这些出现在弹出窗口中:

void glBindAttribLocation(GLuint program, GLuint index, const GLchar * name)
void glBindBuffer(GLenum target, GLuint buffer)
void glBindTexture(GLenum target, GLuint texture)

我在哪里看到列表中的glBindVertexArray()。

因此,似乎缺少glGenVertexArrays()和glBindVertexArray()。但他们怎么会错过这些重要的功能呢?所以,我最有可能在这里错过了一些东西。

我只是想知道是否有人之前使用Xcode 5遇到过GLFW3这个问题?顺便说一下,我没有使用glew或任何其他OpenGL支持的东西。我只使用GLFW3。

我很感激有关此问题的任何提示或指针。

在旁注中,您会建议在Mac上为一个现代(基于着色器的)OpenGL项目创建一个窗口吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:18)

您需要在OS X上包含<OpenGL/gl3.h>才能使用OpenGL 3.2核心API调用。请注意,如果同时包含<OpenGL/gl.h><OpenGL/gl3.h>,则可能会收到编译器警告,这是因为gl3.h有两个目的:

  1. 为核心OpenGL 3.2
  2. 提供函数,枚举和typedef
  3. 消除核心OpenGL 3.2中无效的弃用函数,枚举和typedef

  4. 它们实际上是互斥的,正确的标题取决于您使用的上下文版本:

    • MacOS X 10.7+ :( OpenGL: 2.1

      • #include <OpenGL/gl.h>


    • MacOS X 10.7+ :( OpenGL: 3.2 核心

      • #include <OpenGL/gl3.h>

答案 1 :(得分:10)

GLFW3默认包含<GL/gl.h>。要包含<GL/gl3.h>,您需要在#define GLFW_INCLUDE_GLCOREARB

之前的某处粘贴#include <GLFW/glfw3.h>

在使用自制软件的GLFW3的Mac OSX安装中,include之前的define宏将使用OpenGL/gl3.h。它可以在头文件中看到:

#if defined(__APPLE__)
 #if defined(GLFW_INCLUDE_GLCOREARB)
  #include <OpenGL/gl3.h>
  #if defined(GLFW_INCLUDE_GLEXT)
   #include <OpenGL/gl3ext.h>
  #endif
...

glfw3的build guide概述了定义选项。这也减轻了编译器的警告。