我正在使用OpenGL 3.3的核心前向兼容配置文件。支持的扩展名列出了GL_ARB_MULTITEXTURE等类似的扩展(在OpenGL wiki中标记为在OpenGL 3.1中删除),但为什么我的驱动程序会报告此扩展名为可用?此外,GL_NV_primitive重新启动报告为可用,但它无法与服务器端OpenGL 3+一起使用。那么即使驱动程序不可用或不可用,驱动程序也可以报告任意扩展名支持吗?
我的结论是,我不能依赖驱动程序提供有关扩展的正确信息。此外,标准说驱动程序也没有义务报告核心扩展,但它可能会。
现在,如果我使用核心配置文件为GL版本ab报告了GL_foo_bar的扩展名,我怎么知道它是否不是该特定设置的旧版扩展,如何知道该特定扩展名是否已经不属于ab核心。
此伪代码在不同的OpenGL:版本之间不可移植:if(GL_foo_bar == TRUE)将在OpengGL 2中工作,如果GL_foo_bar是核心的一部分而未报告为驱动程序可用,则可能无法在OpenGL3 +上工作。我无法找到一种万无一失的方法来了解该特定扩展是否真的不受支持或者根本没有报告,所以如果我不想在每个GL函数调用之间需要多个if,我似乎需要一个单独的渲染路径
偏离主题:为什么glGetString(Gl_EXTENSIONS)适用于我的核心配置文件?我认为不应该。
答案 0 :(得分:2)
扩展程序未被“删除”。您的实现支持它想要的任何扩展,无论它是否对当前版本的OpenGL有意义。
我的结论是我不能依赖驱动程序提供有关扩展的正确信息。此外,标准说驱动程序也没有义务报告核心扩展,但它可能会。
这个结论似乎是从错误的方向来解决问题的。版本和扩展只关注一个方面:你想要支持什么?
如果您不打算使用NV_primitive_restart,那么核心OpenGL实现是否在扩展字符串中提及它与您完全无关。您不应该关心扩展字符串是否提到ARB_multitexture,除非您希望根据它是否存在来做不同的事情。
如果您支持GL 2.1,那么您需要找出您希望支持的扩展名,无论是有条件还是必需功能。然后根据这些扩展和版本号编写代码。
如果GL_foo_bar是核心
的一部分
除非GL_foo_bar是core OpenGL extension,否则它永远不会“核心的一部分”。扩展程序背后的功能可以提升为核心,但扩展和核心功能仍然不同。这就是为什么他们有后缀。
ARB_vertex_buffer_object中的缓冲区对象功能在1.5中被提升为核心OpenGL。但是,ARB_vertex_buffer_object公开的函数的行为与核心OpenGL公开的类似函数的行为不同。。 GL 3.1允许它工作:glBindBuffer(GL_UNIFORM_BUFFER, buffer);
。使用glBindBufferARB
调用它可能可以工作(并且很可能会有,但是没有保证它将起作用,无论OpenGL版本号是什么,或者存在一些扩展组合。
这就是存在核心扩展的原因。这样您就可以调用相同的函数并获得相同的行为。如果存在扩展名或者OpenGL版本>> =适当的数字,则可以使用相同的功能。所以一般的伪代码是:if(gl::exts::ARB_uniform_buffer_object || gl::VersionGEQ(3, 1))
。