我正处于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认为我没有这些扩展。
这里发生了什么?
答案 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错误。