Glsl 细分着色器绘图问题

Glsl 细分着色器绘图问题,glsl,shader,tessellation,Glsl,Shader,Tessellation,我目前正在尝试将细分着色器添加到我的程序中,我觉得我已经束手无策了。我已经阅读了一些教程,并在这里深入探讨了许多问题。不幸的是,在这一切之后,我仍然不明白我做错了什么。我很乐意接受任何建议,并且承认我在这里完全是个新手。我的顶点和片段着色器可以工作,但无论我的代码基于哪个教程,添加细分着色器后,我都无法显示任何内容。加载、链接或使用着色器/程序时,我也没有收到任何错误 有问题的四个着色器: 顶点: layout (location = 0) in vec4 vertex; out gl_Per

我目前正在尝试将细分着色器添加到我的程序中,我觉得我已经束手无策了。我已经阅读了一些教程,并在这里深入探讨了许多问题。不幸的是,在这一切之后,我仍然不明白我做错了什么。我很乐意接受任何建议,并且承认我在这里完全是个新手。我的顶点和片段着色器可以工作,但无论我的代码基于哪个教程,添加细分着色器后,我都无法显示任何内容。加载、链接或使用着色器/程序时,我也没有收到任何错误

有问题的四个着色器:

顶点:

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);
}
细分控制着色器:

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);
}
细分评估着色器:

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);
}
片段着色器:

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_面片
作为基本体类型

此外,
GL_面片
没有默认的顶点数,必须设置:
上面列出的代码将绘制一个三角形面片。现在,由于几何体着色器和细分求值着色器不理解
GL_面片
,因此如果删除细分控制着色器,绘制代码将不会执行任何操作。只有镶嵌控制着色器可以理解
GL_面片
基本体,相反,它无法理解任何其他类型的基本体。

能否将实际的GL draw调用添加到代码列表中?如果代码仅适用于顶点和片段着色器,那么我相信您使用的基本体类型是错误的。细分控制着色器需要面片,但没有其他类型的着色器能够从面片基本体中理解面片-因此这意味着您不能绘制面片。谢谢。你说得对。这是我抽签决定中的一个问题。它不能正确显示,但确实显示。这就足够了,至少我可以用它。我太专注于学习如何实现着色器,以至于忽略了这么简单的事情!如果你把它贴出来作为答案,我会很乐意把它标记为已解决。我很乐意,但我不确定你改变了什么?我给了你一个建议,但为了使它在回答形式上有用,我真的需要查看导致问题的原始绘制调用。我仍然有DrawElement在测试着色器之间来回交换时输出三角形。这真是一个愚蠢的错误。如果我运气好的话,我听说四边形和三角形在补丁中一样有效(性能方面)。你知道这是不是真的吗?再次感谢你的帮助!我真的说不出有什么性能差异。我从来没有真正比较过那种事情;)如果有的话,这将远远少于细分非常小的三角形/四边形所浪费的性能。在任何优化工作完成之前,这似乎是镶嵌细分中性能最高的地方;为远处的对象提供与附近对象相同的细分级别。我不认为三角形比四边形更容易出现这个问题。