2013-07-23 6 views
1

Каким образом я могу передать свою геометрию шейдера N (где N является очень большое число, как 10000) вершин и делают их так:Каким образом я прохожу через больше вершин, чем я могу генерировать в GLSL Geometry Shaders?

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 может отличить два?

* Примечание:. Ive модификатором код для доступа к gl_PositionIn [0] и т.д., по-прежнему второй один дает мне ошибку *

+0

В чем «ваша версия?»? – genpfault

+0

Я использую #version 150 –

ответ

3

Это все основано на фундаментальном непонимании того, что делает GS.

Вы не передаете мои геометрические шейдеры N вершин. gl_VerticesIn - это не количество вершин в нарисовать звонок. A Geometry Shader не обрабатывает каждую вершину в обратном вызове одновременно. Геометрические шейдеры работают на primitives. И вызов ничьей создает один или несколько примитивов. gl_VerticesIn - количество вершин в примитиве. И это исправлено для particular primitive type that the GS operates on.

Если вы нарисовали 30 вершин с GL_TRIANGLES в качестве примитивного типа, вы создаете 10 примитивов треугольника. Таким образом, ваши GS будут называться 10 раз. Если вы нарисуете 30 вершин с GL_TRIANGLE_STRIP в качестве примитивного типа, вы создадите 28 примитивов треугольника. Таким образом, ваши GS будут называться 28 раз.

GS использует один примитив в качестве входных данных и испускает 0 или более примитивов в качестве выходных данных (поэтому его следует называть «примитивным шейдером», как и Vertex Shaders, принимают и излучают вершины, а фрагментарные шейдеры принимают и выделяют фрагменты) , Но выходы подлежат various output size limitations. Вот почему ваш второй GS задыхается; вы нарушаете ограничения размера вывода.

+0

«gl_VerticesIn - это не число вершин в обратном вызове». Ах, как глупо от меня, когда я использую GL_POINTS, gl_VerticesIn состоит только из одной вершины. –