我目前正在尝试将曲面细分着色器添加到我的程序中,我觉得好像我的智慧结束了。我已经完成了几个教程,并在这里深入研究了很多问题。不幸的是,在这一切之后我还是不明白我做错了什么。我很乐意接受任何提示,并承认我在这里是一个新手。我的顶点和片段着色器工作,但无论我的代码基于哪个教程,我添加曲面细分着色器后都无法显示任何内容。加载,链接或使用着色器/程序时,我没有错误。
有问题的四个着色器:
顶点:
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);
}
我确定我在这里忽略了一些非常简单的东西,但我在这里绝对亏本。感谢您花时间阅读本文。
答案 0 :(得分:3)
使用曲面细分控制着色器绘制(这是一个可选阶段)时,必须使用GL_PATCHES
作为基本类型。
GL_PATCHES
没有默认的顶点数,您必须设置:glPatchParameteri (GL_PATCH_VERTICES, 3);
glDrawElements (GL_PATCHES, 3, ..., ...);
上面列出的代码将绘制一个三角形补丁。现在,由于几何着色器和曲面细分评估着色器无法理解GL_PATCHES
,因此如果删除曲面细分控制着色器,则绘制代码将不执行任何操作。只有曲面细分控制着色器可以从GL_PATCHES
原语中理解,反之,它无法理解任何其他类型的原语。