在互联网上,我找到了一些 TCS 代码示例,其中gl_TessLevel*
仅为一个输出补丁顶点设置变量
// first code snippet
if ( gl_InvocationID == 0 ) // set tessellation level, can do only for one vertex
{
gl_TessLevelOuter [0] = foo
gl_TessLevelOuter [1] = bar;
}
而不仅仅是
// second code snippet
gl_TessLevelOuter [0] = foo;
gl_TessLevelOuter [1] = bar;
无论有无条件检查,它的工作原理都相似,但我在 OpenGL wiki 上没有找到任何关于这种用法的信息。
如果从逻辑上思考,只在一次 TCS 调用中设置这些变量应该是可以的,而将它们设置为基于gl_InvocationID
. 所以我的问题是:
- 这种设置方式
gl_TessLevel*
是否正确,是否会在某些平台上导致错误或崩溃? - 如果它是正确的,它应该一直使用吗?是地道的吗?
- 最后,这两个片段如何影响性能?由于分支,第一个片段可能会降低性能吗?第二个片段是否会导致后续管道阶段的冗余和/或空闲调用,也会降低性能?