我正在尝试在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+上下文。我真的不知道该怎么做。
答案 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:
在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)
glewExperimental = GL_TRUE;
修改强>
你也开始使用OpenGL Core和
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 2 );
与你的略有不同。