为什么GLEW说我没有扩展?

时间:2014-03-24 19:58:46

标签: c++ opengl glew

我正处于OpenGL应用程序的初始化阶段,我正在添加一些代码来检查各种扩展。我立刻遇到了一个绊脚石:

/* Check for EXT_texture_compression_s3tc */
if (GLEW_EXT_texture_compression_s3tc)
    infomore("GL_EXT_texture_compression_s3tc supported.\n");
else
    errormore("GL_EXT_texture_compression_s3tc unsupported.\n");

/* Check for anisotropic filtering */
if (GLEW_EXT_texture_filter_anisotropic)
    infomore("GL_EXT_texture_filter_anisotropic supported.\n");
else
    warnmore("GL_EXT_texture_filter_anisotropic unsupported.\n");

根据这一点,我的视频卡不支持S3TC和各向异性过滤,即使我知道我确实拥有它。我在这个同一个项目上使用了OpenGL,没有任何问题。 GLEW初始化正常(glewExperimental = true),我的上下文设置正确,其他一切正常,但由于某种原因,glew认为我没有这些扩展。

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

请允许我的sume(适度)疯狂猜测:您是否有机会使用核心配置文件?你是否因此而使用glewExperimental = true

问题在于GLEW在核心配置文件方面只是已损坏。它尝试使用glGetString(GL_EXTENSIONS),这在核心配置文件中无效(现代方式是使用glGetIntegerv(GL_NUM_EXTENSIONS, &ext_cnt); for (i=0; i<ext_cnt; i++) glGetStringi(GL_EXTENSION,i)),并且只会生成错误。 GLEW无法查询哪些扩展可用。现在glewExperimental = true的作用是:忽略扩展似乎缺失的事实,并且无论如何都要查询函数指针。这只是一个大问题,并且函数指针可能存在的事实并不能保证相应的GL扩展确实存在且可用。这个混乱的另一个副作用是你正在经历的:对于GLEW,这些扩展只是不存在。

<强>更新

我不知道为什么GLEW多年来一直没有解决这个问题(甚至提出了补丁以使其与现代核心配置文件兼容),但看起来这种行为仍然存在和我们在一起很长时间。

使用GLEW 2.0,问题终于得到解决,它确实支持核心配置文件,并且不再需要glewExperimental黑客操作系统。它也不会产生GL错误。