Я хочу нарисовать несколько фанатов с помощью GS. Каждый поклонник должен каждый раз рекламировать камеру, что делает необходимым, чтобы каждая вершина умножалась на матрицу MVP. Поскольку каждый вентилятор перемещается пользователем, мне пришла в голову идея передать GS позицию.
Следующий геометрический шейдер работает, как и ожидалось, с точками как на входе, так и на выходе:
uniform mat4 VP;
uniform mat4 sharedModelMatrix;
const int STATE_VERTEX_NUMBER = 38;
layout (shared) uniform stateShapeData {
vec2 data[STATE_VERTEX_NUMBER];
};
layout (triangles) in;
layout (triangle_strip, max_vertices = 80) out;
void main(void)
{
int i;
mat4 modelMatrix = sharedModelMatrix;
modelMatrix[3] = gl_in[0].gl_Position;
mat4 MVP = VP * modelMatrix;
gl_Position = MVP * vec4( 0, 0 , 0, 1 );
EmitVertex(); // epicenter
for (i = 37; i >= 0; i--) {
gl_Position = MVP * vec4( data[i], 0, 1 );
EmitVertex();
}
gl_Position = MVP * vec4( data[0], 0, 1 );
EmitVertex();
}
Я пытался запустить это с glDrawElements
, glDrawArrays
и glMultiDrawArrays
. Ни одна из этих команд не рисует полный веер. Каждый рисует первый заполненный треугольник и остальные вершины как точки.
Итак, нижний вопрос: можно ли нарисовать веер с вершинами, созданными GS, и как?