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

时间:2015-10-11 21:17:42

标签: opengl glsl shader

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

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

1 个答案:

答案 0 :(得分:1)

如果它按照您描述的方式运行(例如 EmitVertex );),那肯定是一个错误。

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

即使它不能保存运行时,在软件的构建过程中使用它也不是一个坏主意,因此您不必等到实际部署软件以捕获这样的简单解析错误。否则,您通常只会在更改驱动程序版本或软件在GPU上运行后才了解这些内容,而以前从未测试过。