如何限制GLSL仅使用核心语言?

4

我一直这样编写着Shader:

#version 330 core
in vec2 tex_position;

uniform sampler2D texture_in;

void main(){
  gl_FragColor = texture(texture_in, vec2(tex_position.x, 1.0 - tex_position.y));
}

这段代码可以编译和运行,但是我的朋友(他在另一台电脑上使用相同的OpenGL/GLSL版本)告诉我它失败了,因为 gl_FragColor 已经被移除。我该如何强制这些着色器只使用标准的GLSL 330,而不是非标准/废弃的内容?


我不知道有什么方法可以强制GLSL编译器拒绝过时的东西,但是检查日志(glGetShaderInfoLog)中是否有警告可能是值得的。 - GuyRT
1
你正在做正确的事情。我的理解是,在版本中包含“core”应该正好符合您的要求。看起来为您的机器提供着色器编译器的图形供应商在其错误检查方面有些自由。一定要尝试@GuyRT建议的方法,并查看它们是否至少会给出警告。 - Reto Koradi
如果你的驱动程序实际上根本没有提供任何诊断信息,那么最好使用另一家供应商的GPU进行开发... - fintelia
1
你是在创建核心或兼容上下文吗?OpenGL4.3(兼容性)规范提到可以写入gl_FragColor或用户定义的输出(没有提到必须使用#version xxx compatibility),而OpenGL4.3(核心)规范根本没有提到gl_FragColor。尽管如此,我同意从GLSL规范中明显的阅读表明包括“core”应该会导致错误。 - GuyRT
据我所知,Mesa和MacOS X具有最佳的核心配置限制,因为兼容性配置根本没有被实现。你可以尝试这些。但是,如上所述,你正在做正确的事情。这是一个错误 - 你使用的是哪个GPU和驱动程序?同样,如上所述,你可以通过将整个GL上下文切换到核心配置来进行更严格的执行。 - sacygan
虽然没有保证的解决方案,但我使用 cgcglslang(khronos 提供的参考“编译器”)和 mesa 的着色器编译器的组合。如果其中至少一个发现了什么,那就已经有点可疑了。 - keltar
1个回答

0

我认为这正是其他人在评论中所写的。可能是错误的上下文属性。通常本地创建的上下文位于Legacy Profile中。您必须将上下文切换到Core Profile(最小版本3.2)。然后,您将获得不同版本的GLSL(最小版本1.50),您的编译器将忽略这些已弃用的内容。

如果您正在使用OS X,则请阅读我的答案:OpenGL - ARB extension


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接