Геометрия GLSL Geometry Shader: итерация по всей сетке
-
22-10-2019 - |
Вопрос
Моя цель состояла в том, чтобы раскрасить вершины в соответствии с их заказом
РЕДАКТИРОВАТЬ: Долгое время.
Я использовал следующий код
#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();
}
}
Но все вершины нарисованы черными, кажется, что я Всегда оценивается как 0, я что -то упускаю или делаю это неправильно?
РЕДАКТИРОВАТЬ: Представьте, что мета-прозрачная вырубка: как подарить все геометрию модели ME в одно геометрический вызов шейдера, чтобы MainLoop итерация по сравнению с всеми вершинами, а не для каждого треугольника.
Решение
Вы не позволяете ни одному геометрическому шейдеру итерации по всем вашим вершинам, это требуется для каждого оригинального примитива (точка, линия, треугольник, ...).
Решение намного проще: в вершинном шейдере (который фактически требуется для каждой вершины) вы можете прочитать специальную переменную gl_VertexID
, который содержит индекс вершины. Этот индекс либо просто счетчик, увеличенный для каждой вершины (при использовании glDrawArrays
) и сбросить каждым вызовом рисования или индексом из массива индексов (если используют использование glDrawElements
).
РЕДАКТИРОВАТЬ: Относительно долгой цели. Не напрямую, но вы можете использовать буфер текстуры для этого. Это в основном позволяет вам получить прямой линейный массив к буферному объекту (в вашем случае вертексный буфер), который вы можете просто индекс с этим индексом вершины. Но также могут быть и другие способы этого, что может быть достаточно для другого вопроса.