То, что вы видите, вызвано алгоритмом растеризации. Рассмотрим следующие две растеризации одинаковой геометрии (красные линии), смещенные всего на половину пикселя:
Как видно, сдвиг всего на половину пикселя может изменить воспринимаемое расстояние между вертикальными линиями с трех до двух пикселей. Более того, горизонтальные линии не сместились, поэтому их внешний вид не изменился.
Это противоречивое поведение - это то, что проявляется в виде "колебания" в вашей анимации.
Один из способов решить эту проблему - включить сглаживание с помощью glEnable(GL_LINE_SMOOTH)
. Убедитесь, что включено правильное смешивание. Это, однако, приведет к размытым линиям, когда они попадают прямо между пикселями.
Если вместо этого вам действительно нужен четкий вид зубчатых линий (например, пиксельная графика), то вам нужно убедиться, что ваша геометрия только когда-либо перемещается на целое число пикселей:
vec2 scale = 2/camera_size;
vec2 offset = -scale*camera_position;
vec2 pixel_size = 2/viewport_size;
offset = round(offset/pixel_size)*pixel_size; // snap to pixels
gl_Position = vec4(scale*in_position + offset, 0.0f, 1.0f);
Добавьте viewport_size
как форму.