我对OpenGL依赖项有疑问。例如,对于ARB_shader_atomic_counters,依赖项部分说明了这一点:
依赖关系
此扩展是针对OpenGL 4.1(核心)规范编写的 和GLSL 4.10.6规范。
需要OpenGL 3.0。
如何阅读此信息?显卡和/或驱动程序是否需要支持OpenGL 4.1或OpenGL 3.0?
可以针对特定规范版本编写扩展,但可以在较旧的OpenGL版本上实现扩展。有些扩展甚至可以在OpenGL 1.1上实现,而其他扩展有更高的基本版本。扩展程序可以出现的最低版本使用文本“X are required”
指定
这只是一种理论上的可能性,很少(如果有的话)驱动程序会实现它吗?或者某些驱动程序会在OpenGL 3硬件上提供此功能吗?我怎样才能知道它是否已实施?
答案 0 :(得分:2)
如果你能提供帮助,你真的不应该读太多。该信息对普通开发人员没有特别帮助。您可能永远不会遇到实现此扩展的GL 3.0实现,因为它是围绕Shader Model 5.0(DX 11)硬件功能设计的。从理论上讲,没有什么能阻止它在3.0中实现,但实际上没有实现此扩展的硬件/驱动程序组合将自己限制在3.0。
如果您要实现扩展或设计一些替代解决方案,那么了解必要的绝对最低API版本将非常有帮助。
当它表示它是针对特定版本的规范编写的时,这意味着任何时候扩展规范都会说明的效果“将以下语言添加到X部分,第Y段,...... “,您将在该特定规格中找到原始未展开的文字。版。这也意味着扩展对事物的行为做出了某些假设。
例如,如果版本X表示点被光栅化为六边形而版本Y表示它们被光栅化为圆形,并且扩展名是针对版本Y编写的,则扩展可以自由地假设点被光栅化为圆形。如果这个假设成为一个争议点,你会在“问题”部分找到一个关于它的模糊。
至于确定扩展是否已实现(从您的角度来看这是最重要的一点),这就是GL_EXTENSIONS
字符串的用途。但请注意,多年来您查询此字符串的方式已发生变化:
// Returns a massive null terminated string containing every extension the
// implementation supports.
//
// ... do a string search to find your extension.
const GLchar* exts = glGetString (GL_EXTENSIONS);
GLint num_exts;
glGetIntegerv (GL_NUM_EXTENSIONS, &num_exts);
for (int i = 0; i < num_exts; i++) {
// Returns a null terminated string containing only one extension
const GLchar* ext = glGetStringi (GL_EXTENSIONS, i);
}
如果您尝试在核心配置文件中执行前者,则GL将生成GL_INVALID_ENUM
错误,而不执行任何其他操作。如果您在核心配置文件中使用GLEW,则在调用glewExperimental = GL_TRUE
之前需要glewInit (...)
这一原因。