opengl - 如何知道特定扩展是否被提升为核心配置文件、从一开始就成为核心扩展还是作为旧扩展删除?

标签 opengl

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

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

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

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

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

最佳答案

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

My conclusion is that I can't rely on the driver providing correct information about extensions. Futhermore, standard says that the driver in not obliged to report core extensions too, but it might.

这个结论似乎是从错误的方向得出的。版本和扩展对您来说只在一个方面很重要:想要支持什么?

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

如果您支持 GL 2.1,那么您需要弄清楚您希望有条件地或根据所需功能支持哪些扩展。然后,您根据这些扩展和版本号编写代码。

if GL_foo_bar is part of the core

除非 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))

关于opengl - 如何知道特定扩展是否被提升为核心配置文件、从一开始就成为核心扩展还是作为旧扩展删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15998505/

相关文章:

opengl - 如何在 z=0 平面中将 2D 变换矩阵(用于齐次坐标)转换为 3D?

windows - 将多个 OpenGL 窗口同步到 vsync

c++ - FPS 计数器的奇怪问题 - 在较新的计算机上限制为 60fps

c++ - 奇怪的体素锥体追踪结果

c++ - Berkelium渲染纹理

OpenGL.org 关闭,库和包含下载的任何镜像站点?

opengl - 浮点纹理到底是什么?

OpenGL 草渲染

c++ - OpenGL-颜色清晰时异常

c++ - 优化 OpenGL 渲染