【问题标题】:glBindFrameBuffer not working with SDLglBindFrameBuffer 不适用于 SDL
【发布时间】:2013-08-27 10:13:59
【问题描述】:

最近我从 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>

这样好吗?

【问题讨论】:

    标签: opengl header sdl framebuffer


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      EDIT1:

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

      EDIT2:

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

      【讨论】:

      • 其实 glBindFrameBuffer 不是扩展。从版本 3 开始,它就是 OpenGL 核心的一部分。所有不带有实现者指示符(如 EXT、ARB 等)的东西都不是扩展。但是,扩展机制用于通过系统支持的 ABI 加载更高版本的 OpenGL 功能。
      • 谢谢你,这就是我想说的:)
      • @datenwolf 那么为什么它可以与 Glut 而不是 SDL 一起使用呢?编辑:我更新了我能够开始工作的问题,这是正确的方法吗?
      • @BlueSpud:嗯,实际上没有。 GLU 太老了,已经过时了,我看不出任何理智的理由,为什么这会解决任何问题。您不应该依赖这种形式的“Voodoo”编程。我只能猜测为什么它会与您的特定版本的 GLUT 一起使用(我想您没有使用原始的、未维护的遗留 GLUT,而是像 FreeGLUT 或 OpenGLUT 这样的库的现代化身。如果这些恰好为内部实例化 FBO 函数使用那些可能会泄漏到外面的东西。但我看不出这在 Windows 上是如何发生的,没有明确的__dllexport;这纯粹是猜测)。
      • @BlueSpud 如果您使用的是 Mac,那么这些编译器指令对您没有任何好处。 #pragma comment (lib, ...) 用于 Microsoft Visual C/C++。在 OS X 上,您只需 #include 并使用 OpenGL 框架即可获得 glBindFramebuffer (...)。除此之外没有任何必要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多