1

为什么我可以通过我的几何着色器 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] 等的代码,但第二个仍然给我一个错误。*

4

1 回答 1

3

这一切都是基于对GS正在做什么的根本误解。

您不会“传递我的几何着色器 N 个顶点”。不是绘图调用gl_VerticesIn中的顶点数。几何着色器不会一次处理绘图调用中的每个顶点。几何着色器对图元进行操作。一个绘图调用会产生一个或多个图元。是图元中的顶点数。这对于 GS 操作的特定原始类型是固定的。gl_VerticesIn

如果使用 GL_TRIANGLES 作为图元类型绘制 30 个顶点,则会生成 10 个三角形图元。所以你的GS会被叫10次。如果您使用 GL_TRIANGLE_STRIP 作为图元类型绘制 30 个顶点,您将生成 28 个三角形图元。因此,您的 GS 将被调用 28 次。

GS 将一个基元作为输入,并发出 0 个或多个基元作为输出(这就是为什么它应该被称为“基元着色器”,就像顶点着色器采用和发射顶点,片段着色器采用和发射片段一样)。但是输出受到各种输出大小的限制。这就是你的第二个 GS 窒息的原因;您违反了输出大小限制。

于 2013-07-23T19:20:01.123 回答