曲面细分着色器绘图问题
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
图元,相反它不能理解任何其他类型的图元。
我目前正在尝试将曲面细分着色器添加到我的程序中,但我觉得我已经无计可施了。我已经阅读了几个教程,并在这里也深入研究了很多问题。不幸的是,我仍然不明白我做错了什么。我会很乐意接受任何提示,并且承认我在这里是个新手。我的顶点和片段着色器可以工作,但无论我的代码基于哪个教程,一旦我添加了曲面细分着色器,我就无法显示任何内容。我在加载、链接或使用 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
图元,相反它不能理解任何其他类型的图元。