2D openGL рисует линии, которые не совсем соответствуют растровому пикселю - PullRequest
3 голосов
/ 14 декабря 2010

Я рисую нечто похожее на светодиодный VU-метр в OpenGL.Результат должен быть таким, как на вертикальной панели:

Animated vumeters

К сожалению, мое пространство для рисования ограничено, и я должен разместить на нем ровно 18 столбцов.Это дает интервал между полосами в 3,6 пикселя.

При рисовании это вызывает видимые различия в промежутках между линиями, поскольку промежутки имеют ширину 2 или 1 пиксель.Я ищу решение использовать субпиксельный рендеринг, а затем «подделывать» строки с помощью какого-либо сглаживания, чтобы все пробелы выглядели одинаковой ширины.

Это мой код до сих пор

glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH, GL_NICEST);
for (int i = 0; i < 18; ++i) {
            float bBottom = barBottom + i*3.6f;
            glBegin(GL_LINES);
            glLineWidth(2);
            glVertex2f(bRight,bBottom);
            glVertex2f(bLeft,bBottom);
            glEnd();
}
glDisable(GL_LINE_SMOOTH);

К сожалению, включение сглаживания линий не показало видимого эффекта.Есть предложения?

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Две идеи:

  1. Нарисуйте все столбцы с большой текстурой за пределами экрана так, чтобы все зазоры и ширины были равны, а затем используйте билинейную фильтрацию, чтобы переместить результат на требуемый экран.положение и размер.

  2. Попросите художника нарисовать все полностью освещенные столбцы так, чтобы они хорошо выглядели, затем нарисуйте черные прямоугольники с альфа-каналом сверху каждого столбца вниз, чтобы затемнить необходимые частиизображение.

1 голос
/ 14 декабря 2010

Использовать мультисэмплинг ( Спецификации мультисэмплинга ).

Кроме того, я бы использовал квадраты (а не линии) для визуализации этих блоков.

0 голосов
/ 14 декабря 2010

Если вы не можете включить сглаживание для своего контекста OpenGl, вы можете эмулировать его - это легко с такой простой графикой. Если вам нужно нарисовать прямоугольник высотой 10,6 пикселей, нарисуйте его цветом 10 пикселей, а затем одну пиксельную линию промежуточного цвета (0,6 цвета прямоугольника и 0,4 цвета фона).

...