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 的交互更加健壮,因为可以捕获对内存的越界访问。有点像sprintfsnprintf 之间的区别。由于这不是着色器扩展,因此在着色器中声明使用它是没有意义的。

编辑 除了实际支持健壮性之外,必须在启用健壮性属性的情况下创建 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 和我的着色器不同意——我有没有那个扩展?的主要内容,如果未能解决你的问题,请参考以下文章

为啥片段着色器没有附加?

GLEW 着色器似乎不受支持

着色器不工作

Phong 着色器不起作用

简单的 OpenTK 着色器不起作用

帧缓冲纹理出现白色(片段着色器不影响它)