0

I am trying to use this tutorial to perform shadow mapping in LWJGL. What I notice is that LWJGL has three classes with all of the framebuffer functions that this tutorial uses: ARBFramebufferObject, EXTFramebufferObject, and GL30.

I don't know which one to use. Can somebody explain the differences of these classes to me, and which one I should be using? I've tried porting the code once and had no luck, so I'd just like this cleared up before I try again.

4

1 回答 1

1

通过使用核心功能,大多数人都可以运行程序,只要他们的显卡可以运行特定的 GL 版本。

  • EXT 扩展通常只有少数供应商支持。
  • 大多数供应商通常都支持 ARB 扩展,但不一定是所有供应商。
  • 每张支持程序正在使用的特定 GL 版本的卡都支持核心功能。

所以底线是核心函数,然后是 ARB 函数,最后是 EXT 函数。虽然当您使用扩展时,请记住在运行时检查显卡是否支持它们。因为不能保证扩展在所有图形卡上都能正常工作,比如核心功能。(同样核心功能只要求显卡支持特定版本的OpenGL)。

还要记住,EXT 和 ARB 扩展并不是唯一可用的扩展,Nvidia、AMD、Apple 等也为 OpenGL 制作了自己的扩展。

记住

您始终需要牢记的是,如果您将其构建到“选择”可用功能的程序中,那么请始终记住您不能使用GL_TEXTURE1withglActiveTextureARB并且不能使用GL_TEXTURE1_EXTwith glActiveTexture。即使混合它们有时仍然会产生预期的结果,但不能保证这一点。

额外的

尝试在这里阅读我的答案,尽管OP询问核心功能和扩展之间的区别,但问题基本上与您的问题相同。

更新

如果 C++ 代码使用 EXT 函数或 ARB 函数,我应该在 OpenGL 中也使用它们,还是只使用核心函数?

一些 ARB、EXT 等功能可能还不是核心功能。您可以说扩展是用于测试新功能。然后当它们经过测试,并且看起来有用且稳定时,它们将被制成核心功能(这真的很抽象)。

虽然如果 ARB、EXT 等功能已经作为核心功能存在。然后使用Core函数,正如已经说过的Core函数只需要特定的OpenGL版本才能运行,同样的保证不要用于扩展。

如果显卡不支持 OpenGL 3.0 或更高版本,那么你当然不能使用那些核心功能。然后你可能会很幸运,你可以使用 ARB 或 EXT 等函数来完成同样的事情。

然后,当我们计算以上所有内容时,我会选择使用GL30来创建帧缓冲区,而不是使用ARBFramebufferObjectand EXTFramebufferObject。虽然如果你不能使用GL30,我会去使用/尝试ARBFramebufferObject然后再使用EXTFramebufferObject

于 2013-10-28T19:06:43.180 回答