2

我正在使用 OpenGL 3.3 的核心前向兼容配置文件。支持的扩展列出了 GL_ARB_MULTITEXTURE 和类似的扩展(在 OpenGL wiki 的 OpenGL 3.1 中标记为已删除),但为什么我的驱动程序报告此扩展可用?此外,GL_NV_primitive restart 报告为可用,但它不能与服务器端 OpenGL 3+ 一起使用。那么驱动程序是否可以将任意扩展报告为受支持,即使它们不应该可用或不可用?

我的结论是我不能依赖驱动程序提供有关扩展的正确信息。此外,标准规定驱动程序也没有义务报告核心扩展,但它可能。

现在,如果我使用核心配置文件将扩展报告为 GL 版本 ab 的 GL_foo_bar,我如何知道它是否不是该特定设置的旧扩展,我如何知道该特定扩展是否还不是 ab 的一部分核。

此伪代码不能在不同的 OpenGL 之间移植:版本:if(GL_foo_bar == TRUE) 将在 OpenGL 2 中工作,如果 GL_foo_bar 是核心的一部分并且驱动程序未报告为可用,则可能无法在 OpenGL3+ 上工作。我找不到一种万无一失的方法来知道该特定扩展是否真的不受支持或根本没有报告,所以如果我不希望每个 GL 函数调用之间有多个 if,我似乎需要一个单独的渲染路径。

题外话:为什么 glGetString(Gl_EXTENSIONS) 与我的核心配置文件一起使用?我认为不应该。

4

1 回答 1

2

扩展名不会“删除”。您的实现支持它想要的任何扩展,无论它是否对当前版本的 OpenGL 有意义。

我的结论是我不能依赖驱动程序提供有关扩展的正确信息。此外,标准规定驱动程序也没有义务报告核心扩展,但它可能。

这个结论似乎是从错误的方向来解决问题的。版本和扩展对你来说只有一个方面很重要:想支持什么?

如果您不打算使用 NV_primitive_restart,那么核心 OpenGL 实现是否在扩展字符串中提及它与您完全无关。您不应该关心扩展字符串是否提到 ARB_multitexture ,除非您希望根据它是否存在来做不同的事情。

如果您支持 GL 2.1,那么您需要确定您希望支持哪些扩展,无论是有条件的还是根据需要的功能。然后根据这些扩展和版本号编写代码。

如果 GL_foo_bar 是核心的一部分

除非 GL_foo_bar 是核心 OpenGL 扩展,否则它永远不是“核心的一部分”。扩展背后的功能可以提升为核心,但扩展和核心功能仍然不同。这就是为什么它们有后缀。

来自 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)).

于 2013-04-14T12:37:36.887 回答