0

最近,我从 Glut 迁移到 SDL,以更好地控制主循环。一段时间以来,我的应用程序中有阴影贴图,现在使用绑定帧缓冲区和生成帧缓冲区之类的调用。迁移到 SDL 后,我收到一个未声明标识符的错误,仅针对这些调用。我今天从网站上下载了SDL并导入了SDL2/SDL.h和SDL2/SDL_opengl.h。当我打开其中一个“未接来电”的声明时,它会在 OpenGl/gext.h 中将其提供给我。我注意到 SDL OpenGL 导入了 OpenGL/gl.h,后者导入了 glext.h。有没有我导入错误的文件?所有其他 OpenGL 调用都在我的程序的其余部分工作,所以我不知道问题出在哪里。任何帮助,将不胜感激。谢谢。

编辑:我能够更深入地研究过剩,并能够想出这个来让它发挥作用:

#pragma comment (lib, "glu32.lib")
#include <OpenGL/glu.h>

这个可以吗?

4

2 回答 2

1

特定版本的OpenGL(Windows:1.1,Linux 1.2)的所有内容都必须通过所谓的扩展机制动态加载。OpenGL 标头并包括它们是不够的。典型的建议是使用像 GLEW 或 glload 这样的加载库来完成繁琐的工作。

于 2013-08-27T00:09:29.367 回答
0

这取决于您使用的平台,但glBindFramebuffer<ARB|EXT> (...)它是许多平台的扩展。它已集成到 OpenGL 3.0 的核心中,因此如果您的平台不保证支持 OpenGL 3.0,您可能必须使用扩展加载库(例如 GLEW)。如果您的驱动程序提供了 OpenGL 3.0,您可能仍然需要使用运行时扩展机制来加载核心功能glBindFramebuffer (...)

“gext.h”包含它的事实并没有说明很多。该标头是定义在运行时扩展的 OpenGL 部分的原型、枚举数/常量和类型定义的地方。您仍然必须在您的软件中设置一个函数指针,并在调用它们之前向驱动程序询问地址 - 这就是扩展加载库所做的事情。

编辑1:

不,这样不行。glBindFramebuffer (...)是 OpenGL 3.0 的一部分。Microsoft Windows 实现了 OpenGL 1.1,GLU 根本不应该改变这一点。如果强制 MSVC 链接 GLU 将未解决的链接器错误修复到 OpenGL 3.0 函数,则存在严重错误。

编辑2:

从评论中的讨论来看,您不仅要从 SDL 迁移到 GLUT,还要从 OS X 迁移到 Win32。在 Win32 上,您必须使用wglGetProcAddress (...)或扩展加载库才能使用glBindFramebuffer (...). 你已经被 Mac OS X 宠坏了,当涉及到开箱即用的 API 完整性时,它更多的是例外而不是规则。

于 2013-08-27T00:08:55.953 回答