Геометрический шейдер GLSL: итерация по всей сетке - PullRequest
2 голосов
/ 05 сентября 2011

Моя цель состояла в том, чтобы раскрасить вершины в соответствии с их порядком

РЕДАКТИРОВАТЬ: долгосрочная цель: доступ к предыдущим и следующим вершинам для имитации гравитационного поведения

Я использовал следующий код

#version 120
#extension GL_EXT_geometry_shader4 : enable
void main( void ) {
    for( int i = 0 ; i < gl_VerticesIn ; i++ ) {
        gl_FrontColor = vec4(float(i)/float(gl_VerticesIn),0.0,0.0,1.0);
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
}

но все вершины нарисованы черным, кажется, что i всегда оценивается как 0, я что-то упускаю или делаю неправильно?

РЕДАКТИРОВАТЬ: разобрался с мета-проблемой: как передать всю геометрию модели в один вызов геометрического шейдера, чтобы основной цикл выполнялся по всем вершинам, а не по каждому треугольнику.

1 Ответ

2 голосов
/ 05 сентября 2011

Вы не позволяете вызову одного геометрического шейдера повторяться по всем вашим вершинам, он вызывается для каждого исходного примитива (точка, линия, треугольник, ...).

Решение гораздо проще:В вершинном шейдере (который фактически вызывается для каждой вершины) вы можете прочитать специальную переменную gl_VertexID, которая содержит индекс вершины.Этот индекс является либо счетчиком, увеличиваемым для каждой вершины (если используется glDrawArrays) и сбрасываемым при каждом вызове отрисовки, либо индексом из массива индекса (если используется glDrawElements).

EDIT: Относительно долгого гола.Не напрямую, но вы можете использовать для этого текстурный буфер .Это в основном позволяет вам получить прямой доступ к линейному массиву к объекту буфера (в вашем случае буфер вершин), который вы затем можете просто индексировать с помощью этого индекса вершин.Но могут быть и другие способы сделать это, которых может быть достаточно для другого вопроса.

...