GLEW 和我的着色器不同意——我有没有那个扩展?
Posted
技术标签:
【中文标题】GLEW 和我的着色器不同意——我有没有那个扩展?【英文标题】:GLEW and my shader disagree - do I have that extension or not? 【发布时间】:2014-11-27 21:07:17 【问题描述】:我在使用着色器时发现了一个奇怪的问题。
我需要ARB_robustness
扩展才能使我的片段着色器正常工作。 GLEW 肯定我有这个扩展:
assert(GLEW_ARB_robustness); // Passes
...但是当我在我的着色器中require
它...
#extension GL_ARB_robustness : require
...着色器编译器无法识别它。
0(3) : error C0202: extension ARB_robustness not supported
GLEW 已正确初始化,只要我不尝试使用该扩展程序,一切正常。
此问题的原因可能是什么,我该如何解决?提前致谢。
更新:在朋友的帮助下,我在我身边戳了一下,我在他的建议下运行了 glxinfo
,并且扩展名确实出现在输出中。
【问题讨论】:
您是否启用了断言?也许用if(GLEW_ARB_robustness)printf("I am robust!");
替换断言并再次检查
@ratchetfreak 现在我的程序很高兴地吹嘘自己很健壮,然后以同样的方式炸毁:p
【参考方案1】:
GL_ARB_robustness
不是 GLSL 修改扩展。此扩展的目的是使与 OpenGL API 的交互更加健壮,因为可以捕获对内存的越界访问。有点像sprintf
和snprintf
之间的区别。由于这不是着色器扩展,因此在着色器中声明使用它是没有意义的。
编辑 除了实际支持健壮性之外,必须在启用健壮性属性的情况下创建 OpenGL 上下文:请参阅 https://www.opengl.org/registry/specs/ARB/wgl_create_context_robustness.txt 和 https://www.opengl.org/registry/specs/ARB/glx_create_context_robustness.txt - 实际上为上下文启用了健壮性,着色器也可以通过。
【讨论】:
我在寻找texelFetch
安全地超出纹理边界(返回纯黑色)的方法时发现了这个扩展,所以我认为它应该在着色器中启用。您能否扩展一下如何以这种方式创建上下文?我目前在 Linux 上使用 SDL2,SDL_GL_CreateContext
。
@Quentin:使用SDL_GL_SetAttribute (SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG);
在调用SDL_GL_CreateContext (...)
之前,请参阅here了解更多详情。
@datenwolf 我似乎混淆了健壮性和健壮性缓冲区访问行为。来自here:“[...] 如果上下文是在启用强大的缓冲区访问的情况下创建的,那么纹素提取的结果将是零,而不是未定义的行为。”以上是关于GLEW 和我的着色器不同意——我有没有那个扩展?的主要内容,如果未能解决你的问题,请参考以下文章