通过使用核心功能,大多数人都可以运行程序,只要他们的显卡可以运行特定的 GL 版本。
- EXT 扩展通常只有少数供应商支持。
- 大多数供应商通常都支持 ARB 扩展,但不一定是所有供应商。
- 每张支持程序正在使用的特定 GL 版本的卡都支持核心功能。
所以底线是核心函数,然后是 ARB 函数,最后是 EXT 函数。虽然当您使用扩展时,请记住在运行时检查显卡是否支持它们。因为不能保证扩展在所有图形卡上都能正常工作,比如核心功能。(同样核心功能只要求显卡支持特定版本的OpenGL)。
还要记住,EXT 和 ARB 扩展并不是唯一可用的扩展,Nvidia、AMD、Apple 等也为 OpenGL 制作了自己的扩展。
记住
您始终需要牢记的是,如果您将其构建到“选择”可用功能的程序中,那么请始终记住您不能使用GL_TEXTURE1
withglActiveTextureARB
并且不能使用GL_TEXTURE1_EXT
with glActiveTexture
。即使混合它们有时仍然会产生预期的结果,但不能保证这一点。
额外的
尝试在这里阅读我的答案,尽管OP询问核心功能和扩展之间的区别,但问题基本上与您的问题相同。
更新
如果 C++ 代码使用 EXT 函数或 ARB 函数,我应该在 OpenGL 中也使用它们,还是只使用核心函数?
一些 ARB、EXT 等功能可能还不是核心功能。您可以说扩展是用于测试新功能。然后当它们经过测试,并且看起来有用且稳定时,它们将被制成核心功能(这真的很抽象)。
虽然如果 ARB、EXT 等功能已经作为核心功能存在。然后使用Core函数,正如已经说过的Core函数只需要特定的OpenGL版本才能运行,同样的保证不要用于扩展。
如果显卡不支持 OpenGL 3.0 或更高版本,那么你当然不能使用那些核心功能。然后你可能会很幸运,你可以使用 ARB 或 EXT 等函数来完成同样的事情。
然后,当我们计算以上所有内容时,我会选择使用GL30
来创建帧缓冲区,而不是使用ARBFramebufferObject
and EXTFramebufferObject
。虽然如果你不能使用GL30
,我会去使用/尝试ARBFramebufferObject
然后再使用EXTFramebufferObject
。