OpenGL 3.3 - 如何在运行时更改tesselataionlevel?

时间:2014-08-06 22:20:20

标签: opengl glsl shader tesselation

如何在运行时更改tesselation leveln?
我唯一的想法是创建一个只有一个变量的缓冲对象,我必须通过它...有没有更好的解决方案?

我有一个tesselation控件着色器文件,可以正常工作:

[...]
void main()
{
    if(gl_InvocationID==0)
    {
    gl_TessLevelInner[0]= 5.0;
    gl_TessLevelOuter[0]=5.0;
    gl_TessLevelOuter[1]=5.0;
    gl_TessLevelOuter[2]=5.0;
    }
 gl_out[gl_InvocationID].gl_Position =gl_in[gl_InvocationID].gl_Position;
}

1 个答案:

答案 0 :(得分:0)

您可以将镶嵌细分值作为制服传递或(因为每个绘制调用的值都是常量)完全绕过曲面细分控制着色器。如果没有TCS链接到着色器程序,则使用 -

提供的值
GLfloat outer_values[4];
GLfloat inner_values[2];
// outer_values and inner_values should be set here
glPatchParameterfv​(GL_PATCH_DEFAULT_OUTER_LEVEL​, outer_values​​);
glPatchParameterfv​(GL_PATCH_DEFAULT_INNER_LEVEL​, inner_values​​);
将改为使用

。在这种情况下,曲面细分评估着色器使用从顶点着色器输出的值。