GLSL 曲面细分控制着色器索引 gl_TessLevelOuter 和 gl_InitationID

Rem*_*tra 2 opengl glsl tessellation

为什么下面的曲面细分控制着色器会使大多数三角形消失?

#version 410

layout(vertices = 3) out;

void main(void) {
    gl_TessLevelInner[0]=1;
    gl_TessLevelOuter[gl_InvocationID]=gl_InvocationID+1;
    gl_TessLevelOuter[gl_InvocationID]=gl_InvocationID+1;
    gl_TessLevelOuter[gl_InvocationID]=gl_InvocationID+1;
}
Run Code Online (Sandbox Code Playgroud)

我输入三角形。当我用 0,1 和 2 索引 gl_TessLevelOuter 时,一切正常。在我看来,这个构造节省了我的 if 语句,我相信这有助于着色器的并行执行。当然,我在片段中省略了顶点计算。

Jer*_*y B 5

接受的答案是不正确的。您可以指定内部级别为 1。如果所有外部级别也为 1,则不会出现曲面细分(三角形将保持不变)。如果内部为 1 并且至少有一个外部>1,则内部将有效为 2 或 3(取决于间距),确保内部区域中至少有 1 个点。

OP 代码的实际问题是它设置了1 个外部级别 3 次,而不是设置所有 3 个外部级别。另外2个默认为0,导致补丁被丢弃。 就是三角形正在消失的原因。

参考: https: //www.opengl.org/wiki/Tessellation