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

TAT*_*ATN 9 opengl macos xcode

我正在尝试在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'
}
Run Code Online (Sandbox Code Playgroud)

所以,这让我相信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)
Run Code Online (Sandbox Code Playgroud)

因此,很可能glgenVertexArrays()确实从库中丢失了.

类似地,对于"glBind ...",当我输入Xcode的名称时,只有这些出现在弹出窗口中:

void glBindAttribLocation(GLuint program, GLuint index, const GLchar * name)
void glBindBuffer(GLenum target, GLuint buffer)
void glBindTexture(GLenum target, GLuint texture)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

预先感谢您的帮助.

And*_*man 19

您需要<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>


rya*_*how 11

GLFW3 <GL/gl.h>默认包含.为了包括<GL/gl3.h>,你需要先粘在#define GLFW_INCLUDE_GLCOREARB某处#include <GLFW/glfw3.h>

在使用自制软件的Mac OSX安装GLFW3时,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
...
Run Code Online (Sandbox Code Playgroud)

定义选项在glfw3 的构建指南中列出.这也减轻了编译器的警告.

  • 仅供参考,今天mac上的这个定义将包括`OpenGL/gl3.h`,所以它现在对Mac很有帮助(因为我刚用它解决了这个问题). (2认同)