曲面细分着色器绘图问题

时间:2015-03-09 22:20:31

标签: glsl shader tessellation

我目前正在尝试将曲面细分着色器添加到我的程序中,我觉得好像我的智慧结束了。我已经完成了几个教程,并在这里深入研究了很多问题。不幸的是,在这一切之后我还是不明白我做错了什么。我很乐意接受任何提示,并承认我在这里是一个新手。我的顶点和片段着色器工作,但无论我的代码基于哪个教程,我添加曲面细分着色器后都无法显示任何内容。加载,链接或使用着色器/程序时,我没有错误。

有问题的四个着色器:

顶点:

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);
}

我确定我在这里忽略了一些非常简单的东西,但我在这里绝对亏本。感谢您花时间阅读本文。

1 个答案:

答案 0 :(得分:3)

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

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

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

上面列出的代码将绘制一个三角形补丁。现在,由于几何着色器和曲面细分评估着色器无法理解GL_PATCHES,因此如果删除曲面细分控制着色器,则绘制代码将不执行任何操作。只有曲面细分控制着色器可以从GL_PATCHES原语中理解,反之,它无法理解任何其他类型的原语。