glsl编译器完全忽略捕获EmitVertex EndPrimitive后缺少括号的错误

glsl compiler completely ignore catching the error of missing parentheses after EmitVertex EndPrimitive

我最近遇到了一个渲染问题,这是由于我无意中错过了在 OpenGL 几何着色器中的 EmitVertex 和 EndPrimitive 之后输入一对括号。令我惊讶的是,glsl 编译器没有抛出任何编译错误并悄悄让它通过。最终结果是一个空白屏幕,因为几何着色器没有发射顶点。

我想知道这是编译器中的错误还是有任何其他原因。 顺便说一句,我已经在带有 Win7 的 nvidia Titan X 和带有 Win8 的 GTX 750M 上对其进行了测试。他们都有同样的问题。

如果它按您描述的方式工作,那绝对是一个错误(例如 EmitVertex );)。

如果您有任何疑问,可以随时使用 Khronos 的 reference compiler 验证您的着色器。这种事情在基于 D3D 的软件中已经很常见了,在构建软件时会预编译着色器; GL 不支持独立于硬件的预编译着色器,因此您只能将其用作验证步骤而不是编译过程的一部分。

尽管它不会节省运行时间,但将它应用到软件的构建过程中并不是一个坏主意,这样您就不必等到软件实际部署后才能捕获像这样的简单解析错误。否则,您通常只会在驱动程序版本更改或软件在以前从未测试过的 GPU 上运行后才能了解这些内容。