0

我正在尝试在 OS X 10.8.4 上的 XCode(版本 4.6.3)中使用 GLFW(版本 3.0.2)和 GLEW(版本 1.10.0)运行一个简单的 OpenGL 程序。整个代码如下所示。

#include <GLFW/glfw3.h>
#include <OpenGL/OpenGL.h>
#include <iostream>
using namespace std;

void RenderScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

void InitGL()
{
    glClearColor(1, 0, 0, 1);
}

void ErrorFunc(int code, const char *msg)
{
    cerr << "Error " << code << ": " << msg << endl;
}

int main(void)
{
    GLFWwindow* window;

    /* Report errors */
    glfwSetErrorCallback(ErrorFunc);

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Window hints */
    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR,  3);
    glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR,  2);
    glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint (GLFW_OPENGL_PROFILE,        GLFW_OPENGL_CORE_PROFILE);

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Initialize OpenGL */
    InitGL();

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        RenderScene();

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

其中大部分直接来自 GLFW 的文档。只有渲染函数和 GLEW 初始化是我的。我为 OpenGL、Cocoa 和 IOKit 添加了框架,并与 libGLEW.a 和 libglfw3.a 链接。该程序编译成功,但在尝试执行 GLEW 应该处理的功能时似乎崩溃了。在这里,程序在glClearBufferfv. 如果我将其注释掉,我会得到一个黑色背景的窗口。我的猜测是 GLEW 秘密地不起作用,因为它没有报告任何错误,但似乎根本没有做它的工作。

XCode 向我抛出的确切错误消息是error: address doesn't contain a section that points to a section in a object file错误代码EXC_BAD_ACCESS。如果我glClearBufferfvglClearColor程序替换不会崩溃,但实际上应该是红色时仍然有黑色背景。查询时,OpenGL 返回版本字符串2.1 NVIDIA-8.12.47 310.40.00.05f01,这解释了为什么对较新函数的调用不起作用,但 GLEW 不应该设置正确的 OpenGL 上下文吗?此外,GLFW 的文档说他们自 GLFW 2.7.2 以来一直在创建 OpenGL 3+ 上下文。我真的不知道该怎么办。

4

2 回答 2

3

glClearBuffer (...)是一个 OpenGL 3.0 的功能,它并不是在所有版本的 OS X 中都实现(有些只实现了 OpenGL 2.1)。因为 OS X 不使用运行时扩展,所以 GLEW 不会为您解决这个问题。

在旧版本的 OS X(10.6 或更早版本)中,您将不得不求助于清除缓冲区的传统方法。这意味着设置“清除颜色”然后清除颜色缓冲区作为一个两步过程。不要使用可以将特定缓冲区清除为特定值的单个函数调用,而是使用以下命令:

#define USE_GL3     // This code requires OpenGL 3.0, comment out if unavailable

void RenderScene()
{
    GLfloat color[] = {1.0f, 0.0f, 0.0f};

#ifdef USE_GL3      // Any system that implements OpenGL 3.0+
    glClearBufferfv (GL_COLOR, 0, color);
#else               // Any other system
    glClearColor    (color [0], color [1], color [2]);
    glClear         (GL_COLOR_BUFFER_BIT);
#endif
}

然而,这并不理想。多次设置清晰的颜色是没有意义的。您应该在初始化应用程序时设置一次清除颜色! USE_GL3并将代码的分支替换为glClear (GL_COLOR_BUFFER_BIT);


现在,因为您提到您使用的是 Mac OS X 10.8,所以您可以忽略我上面写的很多内容。如果操作正确,OS X 10.8 实际上实现了 OpenGL 3.2。

glClearBuffer (...)在 OS X 上工作需要两件事:

  1. Mac OS X 10.7+(你有)
  2. 告诉 glfw 创建一个 OpenGL 3.2 核心上下文

在 glfw 中创建窗口之前,添加以下代码:

glfwWindowHint (GLFW_OPENGL_VERSION_MAJOR,  3);
glfwWindowHint (GLFW_OPENGL_VERSION_MINOR,  2);
glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint (GLFW_OPENGL_PROFILE,        GLFW_OPENGL_CORE_PROFILE);

一旦有了 OpenGL 3.2 核心上下文,您还可以从代码中消除整个! USE_GL3预处理器分支。这是一项允许您的代码在不支持 OpenGL 3.2 的 OS X 实现上工作的条款。

于 2013-09-11T10:33:35.493 回答
0

除非您启用实验选项,否则 GLEW 在 Mac 上并不真正工作。在 GLFW 中设置所有内容后启用它。

glewExperimental = GL_TRUE;

编辑:

而且您还设置使用 OpenGL Core

glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 2 );

和你的略有不同。

于 2013-09-12T02:14:32.373 回答