我如何读取OpenGL依赖关系?
我有一个关于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是必需的”指定
这仅仅是一种理论上的可能性,很少(如果有的话)的驱动程序会实现它? 或者有些驱动程序会在OpenGL 3硬件上提供此功能? 我如何知道它是否被实现?
如果你能帮上忙的话,你真的不应该太多地读到这些。 这些信息对普通开发人员并不特别有用。 您可能永远不会遇到实现此扩展的GL 3.0实现,因为它是基于Shader Model 5.0(DX 11)硬件功能设计的。 理论上,没有什么能够阻止它在3.0中实现,但实际上没有任何实现这个扩展的硬件/驱动组合将会限制到3.0。
如果您要实现扩展或设计一些替代解决方案,那么知道必需的绝对最小API版本将非常有帮助。
当它说它是针对特定版本的规范编写的时,这意味着只要扩展规范说明了“将下列语言添加到X节Y段...”的效果,您就会发现该特定规范中的原始未扩展文本。 版。 这也意味着扩展对事物的行为做出了某些假设。
例如,如果版本X表示点被光栅化为六边形,版本Y表示它们被光栅化为圆形,并且扩展是针对版本Y编写的,则扩展可以自由地假定点被光栅化为圆形。 如果这个假设成为一个争议点,你会在“问题”部分找到关于它的事。
至于确定扩展是否被实现(从你的角度来看这是最重要的一点),这就是GL_EXTENSIONS
字符串的用途。 但请注意,您查询此字符串的方式多年来已发生变化:
在兼容性配置文件环境或GL 3.1或更高版本中:
// 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
错误,而不会执行其他任何操作。 这是glewExperimental = GL_TRUE
在调用glewInit (...)
之前必需的原因,如果您在核心配置文件中使用GLEW。