三角形消失了,因为你招致了“未定义”的行为,就是这样。内部曲面细分级别应至少为 2。
gl_TessLevelInner[0] = 2;
您获得的奇怪结果是因为当内部级别为 1 时如何计算重心坐标。假设您提供了至少 2 作为值,您可以为 Outerlevels 使用您想要的任何值。
以下是三角形的边关联
out0 => edge 1-2
out1 => edge 2-3
out2 => edge 3-1
Out[0] = 4
Out[1] = 1
Out[2] = 2
如您所见,Inner
2 中的 2 沿着三角形的平分线切割了三角形两次,而 3 个不同的Outer
水平线沿着边缘切割了三角形(没有切割1
,两次切割,2
当值为 4 时4
)
提示:
还有一些小建议,tessellation control 中的数据是共享的,也就是说它被多次调用,你只需要设置 tessellation control 一次:
if(gl_InvocationID==0){
gl_TessLevelInner[0] = 2; //take a triangle
gl_TessLevelOuter[0] = 1; //and subdivde it in 3 triangles
gl_TessLevelOuter[1] = 1;
gl_TessLevelOuter[2] = 1;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
那么为什么仍然可以为每次调用设置不同的值呢?那是根据屏幕错误添加细分(至少是合理的使用)。
if(gl_InvocationID==0){
gl_TessLevelInner[0] = 2; //take a triangle
gl_TessLevelOuter[0] = lenghtOnScreen<5? 3: 4;
}
if(gl_InvocationID==1)
gl_TessLevelOuter[1] = lenghtOnScreen<5? 3: 4;
if(gl_InvocationID==2)
gl_TessLevelOuter[2] = lenghtOnScreen<5? 3: 4;
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
到底:
Inner=3
和的另一个例子Outer=2
。
注意沿等分线的 3 个切口和沿边缘的 2 个切口,所有其他切口仅用于“无缝过渡”