Прежде всего, в статье, на которую вы ссылаетесь, используется буфер накопления, в существовании которого я действительно сомневаюсь в OpenGL ES, но я могу ошибаться здесь. Если буфер накопления действительно поддерживается в ES, то, по крайней мере, вам нужно явно запросить его при создании контекста GL (однако это делается в Android).
Обратите внимание, что этот метод крайне неэффективен и не рекомендуется к использованию, поскольку в настоящее время графические процессоры обычно поддерживают сглаживание мультисэмплинга (MSAA). Вам следует выяснить, поддерживает ли ваша система / графический процессор / драйвер мультисэмплинг. Это может потребовать, чтобы вы запросили мультисэмпловый кадровый буфер во время создания контекста или что-то подобное.
Теперь вернемся к статье. Основная идея этой статьи состоит не в том, чтобы быстро перемещать линию, а в том, чтобы визуализировать линию (или фактически всю сцену) несколько раз в очень немного разных (с точностью до субпикселя) местах (в пространстве изображения) и усреднить эти несколько визуализаций чтобы получить окончательное изображение, каждый кадр.
Итак, у вас есть набор позиций сэмплов (в [0,1]), которые на самом деле являются субпиксельными позициями. Это означает, что если у вас есть примерное положение (0,25, 0,75), вы перемещаете всю сцену примерно на четверть пикселя в направлении x и на 3 четверти пикселя в направлении y (конечно, в пространстве экрана) при рендеринге. Когда вы сделали это для каждого отдельного образца, вы усредняете все эти визуализации вместе, чтобы получить окончательный сглаженный рендеринг.
Размерность координатной сцены объекта - это, в основном, размер экрана (фактически, ближняя плоскость объема просмотра) в пространстве объекта, или, что более точно, значения, которые вы передали в glOrtho
или glFrustum
(или аналогичная функция, но с gluPerspective
это не так очевидно). Для изменения матрицы проекции для реализации этого дрожания вы можете использовать функции, представленные в статье.
Величина джиттера составляет не коэффициент сглаживания, а местоположения выборки субпикселя. Фактором сглаживания в этом контексте является количество выборок и, следовательно, количество выполняемых рендерингом смещений. И ваш код не сработает, если я правильно придумаю, а вы попытаетесь дрожать только в конечных точках линии. Вы должны нарисовать всю сцену несколько раз, используя эту дрожащую проекцию, а не только эту единственную линию (хотя она может работать с простым черным фоном и соответствующим смешиванием).
Вы также можете достичь этого без накопительного буфера, используя смешивание (с glBlendFunc(GL_CONSTANT_COLOR, GL_ONE)
и glBlendColor(1.0f/n, 1.0f/n, 1.0f/n, 1.0f/n)
, с n
, являющимся коэффициентом сглаживания / количеством выборок). Но имейте в виду, что вся сцена должна выглядеть так, а не только эта строка.
Но, как уже говорилось, этот метод полностью устарел, и вам лучше искать способ включить MSAA на вашей платформе ES.