【问题标题】:Modern OpenGL with GLFW3 on Mac OSX 10.8.4 - missing glGenVertexArrays() and glBindVertexArray()?Mac OSX 10.8.4 上带有 GLFW3 的现代 OpenGL - 缺少 glGenVertexArrays() 和 glBindVertexArray()?
【发布时间】:2023-04-02 14:28:01
【问题描述】:

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

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

#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 项目打开一个窗口?

提前感谢您的帮助。

【问题讨论】:

  • 听起来很可疑,您包含了&lt;OpenGL/gl.h&gt; 而不是&lt;OpenGL/gl3.h&gt;。这在 OS X 上很重要。
  • 我什至没有包含 。根据 glfw 文档,glfw 为您包含了 。我仅有的包括#include 、#include 用于在着色器中读取,以及#include 用于字符串操作。就是这样。
  • 哇,你明白了。谢谢你,安东。我决定#include ,它成功了!所以,GLFW3 应该包含“gl3.h”,但它没有(它包含“gl.h”)。您能否将您的回复重新发布为答案,以便我接受?再次感谢!

标签: xcode macos opengl


【解决方案1】:

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

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


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

  • MacOS X 10.7+:(OpenGL:2.1

    • #include &lt;OpenGL/gl.h&gt;


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

    • #include &lt;OpenGL/gl3.h&gt;

【讨论】:

  • 是的,你会得到一个编译器警告,但是(此时)由于 GLFW3 自动包含“gl.h”,如果你没有办法绕过它(我不知道)决定使用 GLFW3。
  • 谢谢!我为此打了好几个小时,试图弄清楚为什么我的屏幕是空白的。
【解决方案2】:

GLFW3 默认包含&lt;GL/gl.h&gt;。为了包含&lt;GL/gl3.h&gt;,您需要在#include &lt;GLFW/glfw3.h&gt;之前的某个位置粘贴#define GLFW_INCLUDE_GLCOREARB

在 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 的 build guide 中概述了定义选项。这也减轻了编译器警告。

【讨论】:

  • 这在 OS X 上不会特别有用,因为 Apple 不使用正常的 &lt;GL/gl{3}.h&gt; 约定。他们的GL框架叫做OpenGL,你必须包含&lt;OpenGL/gl{3}.h&gt;
  • 仅供参考,今天在 mac 上的这个定义将包括 OpenGL/gl3.h,所以它现在在 Mac 上肯定很有帮助(因为我刚刚通过使用它解决了这个问题)。
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
相关资源
最近更新 更多