测试 OpenGL 兼容性

Testing OpenGL compatibility

我担心我的代码是在考虑了 OpenGL 3.3 硬件级别支持的情况下开发的。但是我想使用某些扩展,并希望在使用它们之前确保它们都需要 OpenGL 3.3 或更低版本。举个例子,ARB_draw_indirect. It says that "OpengGL 3.1 is required", however there is according to this document 似乎也说明扩展在 3.3 中不可用。这里的问题是我的两台开发机器都支持 4.5 的硬件,这意味着一切正常,包括那些需要 OpenGL 4.x 的功能。所以我想知道如何在不购买 3.3 class 显卡的情况下测试 3.3 兼容性?简单来说,我的开发硬件与我计划支持的相比太强大了,因此不确定如何测试我的代码。

编辑:在相关说明中,有 EXT_direct_state_access 扩展,DSA 在 OpenGL 4.5 核心配置文件中。主要区别在于函数名称中的 EXT 后缀。假设我想坚持 OpenGL 3.3 支持,我应该使用带有 EXT 后缀的函数名吗?示例:TextureParameteriEXT( ) 与 TextureParameteri( )

在查看版本时,您似乎混淆了两个方面。为了使这一点更清楚,向 OpenGL 添加新功能通常有两个主要步骤:

  1. 定义了一个扩展。它可以用于支持特定扩展的实现。当您使用它时,入口点将具有 EXTARB 或供应商名称作为其名称的一部分。
  2. 对于某些扩展,后来决定它们应该成为核心功能。有时新的核心功能可能与扩展完全一样,有时它可能会在提升为核心功能时进行调整。一旦它成为核心功能,入口点将看起来像任何其他 OpenGL 入口点,没有任何特殊的 pre-/postfix.

现在,如果您查看扩展规范,您会看到:

OpengGL 3.1 is required

这里指的是上面的第1步。有人定义了一个扩展,并说这个扩展是基于 OpenGL 3.1 的。因此,任何至少支持版本 3.1 的 OpenGL 实现都可以 提供对此扩展的支持。它仍然是一个扩展,这意味着它是可选的。要使用它,您需要:

  • 至少有 OpenGL 3.1。
  • 测试扩展是否可用。
  • 在入口点使用 EXT/ARB/vendor prefix/postfix。

绝对不是意味着该功能是核心 OpenGL 3.1 的一部分。

如果有人说:

DSA is in the OpenGL 4.5 core profile

这里指的是上面的第2步。最初在 DSA 扩展中定义的功能在 4.5 中被提升为核心功能。要使用此核心功能,您需要:

  • 至少有 OpenGL 4.5。
  • 在入口点使用 EXT/ARB/vendor prefix/postfix。

一旦扩展成为您所针对的 OpenGL 版本中的核心功能,这通常就是您应该做的。所以在这种情况下,您不再使用 prefix/postfix。

确保您只使用目标 OpenGL 版本的功能并不像您想象的那么简单。创建此版本的 OpenGL 上下文通常是不够的。实现可以而且经常会为您提供支持更高版本的上下文。您指定的版本被视为最低版本,而不是您获得的确切版本。

如果您在需要扩展加载器(Windows、Linux)的平台上工作,我相信有一些扩展加载器可以让您为特定的 OpenGL 版本生成头文件。那可能是你最好的选择。除此之外,您需要检查规范以确认您要使用的调用在您的目标版本中可用。