11

我正在尝试在 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。

我将不胜感激有关此问题的任何提示或指示。

在旁注中,您会推荐哪个工具(除了 glfw)来在 Mac 上为现代(基于着色器)OpenGL 项目打开一个窗口?

预先感谢您的帮助。

4

2 回答 2

20

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

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


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

  • MacOS X 10.7+:(OpenGL:2.1

    • #include <OpenGL/gl.h>


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

    • #include <OpenGL/gl3.h>
于 2013-11-07T02:05:02.673 回答
13

GLFW3<GL/gl.h>默认包含。为了包含<GL/gl3.h>,您需要先粘贴#define GLFW_INCLUDE_GLCOREARB到某个地方#include <GLFW/glfw3.h>

在 GLFW3 的 Mac OSX 安装上,使用自制软件,包含之前的定义宏将使用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的构建指南中概述了定义选项。这也减轻了编译器警告。

于 2014-02-13T08:20:05.647 回答