GLEW在XCode中崩溃

时间:2013-09-11 01:43:30

标签: xcode cocoa opengl glew glfw

我正在尝试在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。如果我用glClearBufferfv替换glClearColor,程序不会崩溃,但是当它实际上应该是红色时仍然有黑色背景。查询时,OpenGL返回版本字符串2.1 NVIDIA-8.12.47 310.40.00.05f01,这解释了为什么对较新函数的调用不起作用,但是GLEW不应该设置正确的OpenGL上下文?此外,GLFW的文档说他们自GLFW 2.7.2以来一直在创建OpenGL 3+上下文。我真的不知道该怎么做。

2 个答案:

答案 0 :(得分: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核心上下文
  3. 在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实现上工作的规定。

答案 1 :(得分:0)

除非你启用了实验选项,否则GLEW在mac上并没有真正起作用。在GLFW中设置所有内容后启用它。

glewExperimental = GL_TRUE;

修改

你也开始使用OpenGL Core和

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

与你的略有不同。