6

所以这个是一个doozie;
我有一个相当大的 OpenGL 解决方案,在 Windows 7 中使用 GLSL 1.5 的 3.2 版核心编写。我使用 GLEW 和 GLM 作为辅助库。当我创建一个窗口时,我使用以下几行:

// Initialize main window
glewExperimental = GL_TRUE;
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // Use OpenGL Core v3.2
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
if(!glfwOpenWindow(Game::WINDOW_X, Game::WINDOW_Y, 0, 0, 0, 0, 32, 0, GLFW_WINDOW))
{ ...

如果我省略了三个 glfwOpenWindowHint 函数,应用程序会在调用 glDrawArrays(GL_TRIANGLES, 0, m_numIndices); 时使我的视频驱动程序崩溃。

但这是踢球者。当我小组中的其他人尝试更新和运行解决方案时,他们会得到一个没有几何图形的空白窗口。注释掉这三行会使程序对它们运行良好。在使用 3.2core 提示和不使用 3.2core 提示之间存在相当大的差异。我无法确定 nVidia、AMD、台式机或笔记本电脑之间的任何区别。

我能找到的最好的建议是添加 glewExperimental = GL_TRUE; 因为据说 Glew 的核心有问题。它没有任何区别。该解决方案太大而无法发布代码,但我可以根据需要放置着色器、渲染代码等。

非常感谢!这已经杀死了我们好几天了。

4

2 回答 2

10

尝试请求一个向前兼容的 GLFW 窗口:

GLFW_OPENGL_FORWARD_COMPAT - 指定 OpenGL 上下文是否应该向前兼容(即不允许遗留功能)。这仅应在请求 OpenGL 3.0 或更高版本时使用。

并尝试设置配置文件提示,让系统选择:

// Use OpenGL Core v3.2
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

另外,请确保您确实获得了所需的版本:

int major, minor, rev;

glfwGetGLVersion(&major, &minor, &rev);

fprintf(stderr, "OpenGL version recieved: %d.%d.%d", major, minor, rev);

不确定您是否也为 Mac 运行,但还是请阅读:

A.4 Mac OS X 上的 OpenGL 3.0+

Mac OS X 10.7 引入了对 OpenGL 3.0 及更高版本的支持,即便如此,仍支持向前兼容的 OpenGL 3.2 核心配置文件上下文,并且没有请求调试上下文的机制。早期版本的 Mac OS X 最多支持 OpenGL 2.1 版。

因此,在 Mac OS X 10.7 上,如果给出高于 3.2 的版本,则 GLFW_OPENGL_VERSION_MAJOR 和 GLFW_OPENGL_VERSION_MINOR 提示将失败,忽略 GLFW_OPENGL_DEBUG_CONTEXT 和 GLFW_FORWARD_COMPAT 提示,并且将 GLFW_OPENGL_PROFILE 提示设置为除零或 GLFW_OPENGL_CORE_PROFILE 之外的任何值或 GLFW_OPENGL_CORE_PROFILE 将导致失败

此外,在 Mac OS X 10.6 及更低版本上,如果给出高于 2.1 的版本,则 GLFW_OPENGL_VERSION_MAJOR 和 GLFW_OPENGL_VERSION_MINOR 提示将失败,GLFW_OPENGL_DEBUG_CONTEXT 提示将无效,并且将 GLFW_OPENGL_PROFILE 或 GLFW_FORWARD_COMPAT 提示设置为非零值将导致 glfwOpenWindow 失败.

于 2012-01-26T11:48:59.687 回答
0

我遇到了同样的问题。我必须在我的 VBO 之前创建一个 VAO,现在它可以在 OS X 上运行。

GLuint vertex_array;
glGenVertexArrays(1, &vertex_array);
glBindVertexArray(vertex_array);
于 2013-04-12T00:11:18.633 回答