如何在OpenGL 3.1中正确渲染到纹理

时间:2013-11-09 07:03:23

标签: opengl textures framebuffer opengl-3 render-to-texture

这将是我第一次渲染到默认帧缓冲区以外的任何内容,我的搜索表明FBO是执行此任务的方法。实际上,它们似乎是我所看到的唯一方法 - 如果我错了,请纠正我。

我特意将自己限制在自 3.1 以来一直是核心的OpenGL功能。根据{{​​3}},FBO自3.0以来一直是核心。

我在设置FBO以及如何为它们添加纹理方面找到了大量资源,但它们都使用了(根据OpenGL wiki)自3.2以来只有核心的函数(例如,{{3 }和OpenGL wiki)。

使用OpenGL 3.1或更低版本渲染纹理的正确/推荐方法是什么?应该注意的是,我需要一个深度缓冲区来处理我正在渲染的内容(这是FBO提供的一个功能)。

注意:我最初的标题是“如何将纹理附加到OpenGL 3.1中的帧缓冲区对象。”,但是如果有其他选项,则使用更通用的标题。

2 个答案:

答案 0 :(得分:2)

  

实际上,它们似乎是我所见过的唯一方法 - 如果我错了,请纠正我。

还有PBuffers,但你不想使用它们。它们使用起来很麻烦,难以设置并且可能在不方便的时候使其内容无效。供参考:PBuffers是一种看不见的窗户。它们本身就没用了,因为它们无法渲染到纹理;即渲染到PBuffer后必须复制到纹理。然后引入了扩展以允许将PBuffer绑定为纹理。

不要打扰他们。

  

我特意将自己限制在自3.1以来一直是核心的OpenGL功能

实际上帧缓冲对象已存在很长时间了。而且因为它们主要是内存管理的东西,即使是最老的GPU也可以实际支持它们;至少如果你让他们的格式类似于典型的屏幕帧缓冲。

直到OpenGL-3帧缓冲对象是一个所谓的扩展,如果你看一下framebuffer对象扩展的规范ARB_framebuffer_object,你会发现它们已经被批准了时间12岁的OpenGL-1.1;之前已经以EXT_framebuffer_object扩展名的形式开始了它的工作。

所以,好吧,他们得到了很好的支持。如果你限制自己使用OpenGL-3,你就不必费心了,但是如果你想支持更广泛的硬件(比如我最近的项目确实如此; OpenGL-2.1是目标),那么你将会必须使用该扩展名。

  

根据OpenGL维基

OpenGL wiki不是授权参考。规格是。根据OpenGL-3.0,这些功能是指定功能的一部分。请注意,OpenGL确实仅在OpenGL-3.2中引入了核心兼容性配置文件,因此您之前不会找到任何核心的原因OpenGL的3.2

答案 1 :(得分:0)

您使用哪个Windows版本?如果您至少具有Intel HD 3000并使用Windows 10,则考虑降级到Windows 7并重新安装驱动程序,因为Windows 7可以在大多数应用程序上正常运行,例如:我使用Windows 10,并且当我尝试使用GZDoom播放Doom时,它说使用老式版本,因为我没有OpenGL 3.3,因为Intel HD 3000仅支持OpenGL 3.1。虽然两个Windows都使用OpenGL 3.1,但Windows 7往往具有更多的功能兼容性。回到该示例,在我降级到Windows 7之后,我尝试再次安装它,它似乎在没有任何补丁或调整的帮助下启动。所以这可能很有用。