gpt4 book ai didi

xcode - GLEW 在 XCode 中崩溃

转载 作者:行者123 更新时间:2023-12-03 17:34:12 24 4
gpt4 key购买 nike

我正在尝试在 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 secret 地不起作用,因为它没有报告任何错误,但似乎根本没有完成其工作。

XCode 向我抛出的确切错误消息是错误:地址不包含指向对象文件中的部分的部分,错误代码为EXC_BAD_ACCESS 。如果我用 glClearColor 替换 glClearBufferfv ,程序不会崩溃,但实际上应该是红色的背景时仍然有黑色背景。查询时,OpenGL 返回版本字符串 2.1 NVIDIA-8.12.47 310.40.00.05f01,这解释了为什么调用较新的函数不起作用,但 GLEW 不应该设置正确的 OpenGL 上下文?此外,GLFW 的文档表示,自 GLFW 2.7.2 以来,他们一直在创建 OpenGL 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 实现上运行的规定。

关于xcode - GLEW 在 XCode 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com