为什么我通过比GLSL几何着色器生成的顶点更多的顶点?

时间:2013-07-23 16:23:17

标签: opengl glsl geometry-shader

为什么我可以传递几何着色器N(其中N是一个非常高的数字,如10000)顶点,并像这样渲染它们:

for (int i = 0; i < gl_VerticesIn; ++i) {
    gl_Position = projectionmodelview_matrix_ * gl_PositionIn[i];
    EmitVertex();
}

...但我不能像这样产生N个顶点(当只传递一个顶点时):

for (int i = 0; i < N; ++i) {
    float f = float(i);
    gl_Position = projectionmodelview_matrix_ * vec4(f, f, f, 1.0);
    EmitVertex();
}

OpenGL如何区分两者?

*注: 我修改了访问gl_PositionIn [0]等的代码,还是第二个给了我一个错误。*

1 个答案:

答案 0 :(得分:3)

这完全基于对GS正在做什么的基本误解。

你没有“传递我的几何着色器N个顶点”。 gl_VerticesIn不是绘制调用中的顶点数。 Geometry Shader不会同时处理绘制调用中的每个顶点。几何着色器在primitives上运行。并且绘制调用产生一个或多个基元。 gl_VerticesIn是基元中的顶点数。这对于particular primitive type that the GS operates on已修复。

如果使用GL_TRIANGLES作为基本类型绘制30个顶点,则会生成10个三角形基元。所以你的GS将被召唤10次。如果使用GL_TRIANGLE_STRIP作为基本类型绘制30个顶点,则将生成28个三角形基元。所以你的GS将被召唤28次。

GS将一个基元作为输入,并发出0或更多基元作为输出(这就是为什么它应该被称为“基元着色器”,就像顶点着色器采用并发射顶点和片段着色器采集和发射片段一样)。但输出受various output size limitations的约束。这就是你的第二个GS窒息的原因;你违反了输出尺寸限制。