У меня есть набор трехмерных точек, и я хочу визуализировать каждую из этих точек в виде прямоугольников (для простоты). Я хочу, чтобы эти прямоугольники имитировали поведение трехмерных объектов в том смысле, что они сохраняют соотношение сторон по отношению к камере. В основном я хочу, чтобы они делали что-то вроде этого:
Вот что я делаю: в вершинном шейдере я в основном ничего не делаю и просто передаю вершину вниз по конвейеру
gl_Position = vec4(vtx_position, 1.0);
В геометрическом шейдере я пытаюсь сгенерировать эти прямоугольники, проецируя входные вершины в пространство просмотра модели, а затем генерируя 4 выходные вершины с одинаковым смещением от входа и выдачи их после умножения на матрицу проекции:
uniform mat4 MV;
uniform mat4 PROJ;
uniform float size;
position = MV * gl_in[0].gl_Position;
gl_Position = position;
gl_Position.xy += vec2(-size, -size);
gl_Position = PROJ * gl_Position;
EmitVertex();
gl_Position = position;
gl_Position.xy += vec2(-size, size);
gl_Position = PROJ * gl_Position;
EmitVertex();
gl_Position = position;
gl_Position.xy += vec2(size, -size);
gl_Position = PROJ * gl_Position;
EmitVertex();
gl_Position = position;
gl_Position.xy += vec2(size, size);
gl_Position = PROJ * gl_Position;
EmitVertex();
Наконец, во фрагментном шейдере я просто заливаю их цветом. Однако на выходе я получаю что-то вроде этого:
Хотя каждый прямоугольник расположен правильно, их размеры отключены. Что я сделал не так? Что нужно сделать, чтобы добиться результата, как на первом рисунке?