【问题标题】:Is GL_ARB_compatibility valid in a core proflie?GL_ARB 兼容性在核心配置文件中是否有效?
【发布时间】:2020-07-02 15:16:34
【问题描述】:

我有一个使用 OpenGL 进行渲染的程序。在这样做时,它取决于有一个核心配置文件,但即使没有可用的核心配置文件,我总是想创建一个 OpenGL 上下文,如果只是为了能够在报告没有合适的配置文件的错误时查询驱动程序供应商和版本可用。出于这个原因,即使没有可用的核心配置文件,我总是使用 some 可用的配置文件来尝试初始化,并在初始化期间检查配置文件是否符合我的先决条件,特别是 OpenGL 版本至少为 3.0,并且 GL_ARB_compatibility 不存在。

但是,我收到了来自用户的错误报告,他们的驱动程序似乎违反了这些假设。这是一个例子:

  • GL_VENCOR:ATI Technologies Inc.
  • GL_VERSION:4.2.11411 Core Profile Context
  • GL_RENDERER:AMD Radeon HD 7610M
  • GL_EXTENSIONS:[...] GL_ARB_compatibility [...]

可以看出,glGetString(GL_VERSION) 说它是一个“核心配置文件上下文”,但GL_EXTENSIONS 包含GL_ARB_compatibility

我应该如何解释这个?这是一个有效的配置吗?如果是,这对核心配置文件和兼容性配置文件之间不同的功能意味着什么?还是应该将其视为驱动程序错误?有没有更好的方法来检查给定的 OpenGL 上下文是核心还是兼容性?

【问题讨论】:

  • OpenGL 3.1 中没有配置文件的概念,在 3.0 中更是如此。因此,如果您在 OpenGL 3.1 的最大实现(不支持 3.2 或更高版本)上运行您的软件,无论如何您都会得到GL_ARB_compatibility
  • @Ruslan:你是对的,当然。我想我已经不支持 3.0/3.1 甚至没有意识到这一点。

标签: opengl


【解决方案1】:

您在创建上下文时要求获得核心配置文件。如果您要求提供核心配置文件,您将获得核心配置文件或上下文创建失败

没有什么可解释的:如果您要求提供核心配置文件,并且您创建了一个上下文,那么您就会得到一个核心配置文件。您无需询问个人资料是否为核心,因为您应该已经知道,因为您要求制作个人资料。

如果您要求提供核心配置文件,那么您不必关心“GL_ARB_compatibility”是否可用;你甚至不应该看它,你绝对不应该基于它查询函数。

但是如果你真的想检查一个上下文是核心还是兼容性,你可以调用glGetIntegerv(GL_CONTEXT_PROFILE_MASK。它将返回一个包含GL_CONTEXT_CORE_PROFILE_BITGL_CONTEXT_COMPATIBILITY_PROFILE_BIT 的位掩码。

【讨论】:

  • 为了使用这个逻辑,我必须创建额外的数据结构来进行上下文创建的初始化。我当然可以 这样做,但是如果我可以查询上下文(无论如何我正在做的一个阶段),那显然会更简单。我的意思是,如果没有更好的方法,我当然会这样做,但这就是我要问的原因。
  • 至于GL_CONTEXT_PROFILE_MASK,如果我错了,请纠正我,但它不需要OpenGL 3.3或类似的吗?这里的部分问题是,我希望能够可靠地查询这些特征,即使在 Microsoft 的默认 OpenGL 1.1 软件上下文(如果没有安装 OpenGL 驱动程序时获得),同时也不需要高于 3.0。
  • @Dolda2000: "这里的部分问题是,即使在微软默认的 OpenGL 1.1 软件上下文等上下文中,我也希望能够可靠地查询这些特性" 这些特性 在旧的 OpenGL 版本中不存在,因此查询它们没有意义。
  • 虽然是真的,但我目前正在查询的东西(GL_MAJOR_VERSIONGL_EXTENSIONS、&c)确实存在,这让我可以以某种与版本无关的方式查询我是否在匹配的上下文。
  • 无论哪种方式,考虑到一切,似乎首先要求核心配置文件并跟踪上下文是否来自该是明智的选择,因此我将其标记为解决方案。
【解决方案2】:

可以看出,glGetString(GL_VERSION) 说它是一个“核心配置文件上下文”,但GL_EXTENSIONS 包含GL_ARB_compatibility。 我该如何解释?

让我引用OpenGL 3.2 core profile specification 的附录 E.1(强调我的):

OpenGL 3.2 是第一个定义多个配置文件的 OpenGL 版本。 核心配置文件建立在 OpenGL 3.1 之上,添加了描述于 H.1 节。 兼容性配置文件建立在以下方面的组合之上 OpenGL 3.1 定义了特殊的GL_ARB_compatibility 扩展 与 OpenGL 3.1 一起添加了相同的新功能,并且在某些 案例扩展其定义以与现有特征交互 OpenGL 3.1 仅在 GL_ARB_compatibility 中找到。

不可能 在单个 GL 上下文中实现核心和兼容性配置文件, 因为核心配置文件要求功能限制不存在于 兼容性配置文件。 [...]

因此,兼容性配置文件明确定义为依赖 GL_ARB_compatibility,我认为在核心配置文件中宣传该扩展的实现将违反规范的该部分。

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2014-12-22
    • 2018-11-24
    • 2017-12-18
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多