2013-09-11 80 views
0

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

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

+0

没有GLEW时,Xcode抱怨'glClearBufferfv'没有定义。如果我使用'glClearColor'代替它运行,但总是给我黑色,无论我指定什么颜色。 –

+0

用'glfwWindowHint'强制设置所需的OpenGL版本似乎也不起作用。它崩溃的任何版本2.1以上... –

+0

GLEW不会创建一个OpenGL上下文;它依靠应用程序创建一个应用程序,然后才能获取其所有功能。就你而言,我认为GLFW将创建OpenGL上下文。 – radical7

回答

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 
} 

这不是理想的,但是。多次设置清晰颜色没有意义。应设置清晰的彩色一个时间,当你初始化应用程序,并与glClear (GL_COLOR_BUFFER_BIT);


现在替换代码的! USE_GL3分支,因为你提到你使用的是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实现上工作。

+0

当我设置这些参数时,窗口创建失败,出现错误“65544:入口点检索已损坏”。我设法找出这个错误的唯一办法是,它意味着调用'glfwGetProcAddress(“glGetStringi”)'失败。 –

+0

@JonathanPeck:更新了我的答案以包含前向兼容性位。尝试新的一系列提示,看看他们是否解决了你的问题。 –

+0

同样的错误:'入口点检索已损坏。没有这些提示,我确实有一个功能完整的2.1环境,但我的系统应该能够达到3.2。 –

0

除非启用实验性选项,否则GLEW在mac上不能正常工作。在GLFW中设置所有内容后启用它。

glewExperimental = GL_TRUE; 

编辑:

而且您还可以设置使用OpenGL的核心与

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

从你的略有不同。

+0

这允许我调用像glClearBuffer这样的函数,而不会崩溃,但我仍然留下了OpenGL 2.1上下文。 –

+0

现在没有时间了,所以我只是复制了我以前的简单示例代码。我会看看我以后能不能做任何事,但在这里你走。 http://pastebin.com/9JvCVbxH – TheAmateurProgrammer