曲面细分着色器绘图问题

Tessellation shader drawing issues

我目前正在尝试将曲面细分着色器添加到我的程序中,但我觉得我已经无计可施了。我已经阅读了几个教程,并在这里也深入研究了很多问题。不幸的是,我仍然不明白我做错了什么。我会很乐意接受任何提示,并且承认我在这里是个新手。我的顶点和片段着色器可以工作,但无论我的代码基于哪个教程,一旦我添加了曲面细分着色器,我就无法显示任何内容。我在加载、链接或使用 shaders/program 时都没有出错。

有问题的四个着色器:

顶点:

layout (location = 0) in vec4 vertex;

out gl_PerVertex{
vec4 gl_Position;
};

void main()
{
gl_Position = gl_Vertex;
//note I have to multiply this by the MVP matrix if there is no tessellation
}

曲面细分控制着色器:

layout (vertices = 3) out;

out gl_PerVertex {
 vec4 gl_Position;
 } gl_out[];

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

细分评估着色器:

layout(triangles, equal_spacing, ccw) in;
uniform mat4 ModelViewProjectionMatrix;
out gl_PerVertex{
vec4 gl_Position;
};

void main()
{
 vec4 position =    gl_TessCoord.x * gl_in[0].gl_Position +
                    gl_TessCoord.y * gl_in[1].gl_Position +
                    gl_TessCoord.z * gl_in[2].gl_Position;
 gl_Position = ModelViewProjectionMatrix * position;
}

片段着色器:

void main()
{
gl_FragColor = vec4(0.1, 0.4, 0.0, 1.0);
}

我确信我在这里忽略了一些非常简单的东西,但我在这里完全不知所措。感谢您花时间阅读本文。

当您使用曲面细分控制着色器(这是一个可选阶段)进行绘制时,您必须使用 GL_PATCHES 作为基元类型。

此外,GL_PATCHES没有默认的顶点数,您必须设置:

glPatchParameteri (GL_PATCH_VERTICES​, 3);
glDrawElements    (GL_PATCHES, 3, ..., ...);

上面列出的代码将绘制一个三角形补丁。现在,由于几何着色器和曲面细分评估着色器不理解 GL_PATCHES,如果您删除曲面细分控制着色器,绘制代码将不执行任何操作。只有曲面细分控制着色器可以理解 GL_PATCHES 图元,相反它不能理解任何其他类型的图元。