Рисование круга с помощью алгоритма Брезенхема в OpenGL

Я могу нарисовать круг с помощью алгоритма. Однако граница выглядит странно, пиксели выглядят такими отдельными друг от друга. Я хочу, чтобы они были ближе. Я попытался увеличить размер точки. Но результат не очень. Итак, я подумал, что, может быть, было бы лучше, если бы я мог полностью заполнить пиксель (я полагаю, он имеет квадратную форму). Как мне это сделать, или у вас есть идея получше? Сейчас это выглядит так: http://img690.imageshack.us/i/circlev.jpg/

Заранее большое спасибо.


person Sammy    schedule 28.02.2011    source источник
comment
Зачем вам повторно реализовывать Bresenham с OpenGL? OpenGL уже предоставляет вам линейный примитив.   -  person datenwolf    schedule 28.02.2011
comment
@datenwolf, это классическая домашняя задача на вводном уроке компьютерной графики.   -  person Bob Cross    schedule 28.02.2011
comment
Я думаю, что OpenGL не подходит для этой работы. Но в любом случае вам нужно опубликовать код, с которым вы хотите получить помощь в этом вопросе (т.е. не публиковать его в pastebin и не ссылаться на него). Вероятно, можно достаточно лоботомировать OpenGL, чтобы заставить его делать то, что вы хотите, но для этого, вероятно, потребуется настроить его очень специфическим образом.   -  person Omnifarious    schedule 28.02.2011
comment
@Bob Cross: я знал, что это, вероятно, домашнее задание. Тем не менее, OpenGL не подходит для этой работы, так как растеризация происходит ближе к концу конвейера. Хорошим домашним заданием было бы попросить студента реализовать Брезенхэма на растровом изображении в памяти.   -  person datenwolf    schedule 28.02.2011
comment
@datenwolf, ну, это проблема с учебной программой. Я знаю, что трудно преподавать вводные курсы в нескольких рамках. В OpenGL нет ничего, что делало бы эту проблему неразрешимой, и с помощью надлежащего окружающего кода вы можете сделать этап растеризации достаточно прозрачным.   -  person Bob Cross    schedule 01.03.2011
comment
@Bob Cross: точное размещение точек (или других вещей) в пикселях в OpenGL не так тривиально, как может показаться на первый взгляд, поскольку OpenGL работает с сопоставленными координатами, а не с индексами местоположения в массиве растровых изображений. Также я сомневаюсь, что пример Брезенхэма в OpenGL столь же поучителен, как его реализация на массиве растровых изображений. Все дело в том, как эффективно заполнить биты в массиве с помощью схемы, которая просто увеличивает счетчики, а не находит координаты для их размещения - последнее можно было бы сделать намного проще с помощью мистера Пифагора и векторной алгебры.   -  person datenwolf    schedule 01.03.2011


Ответы (3)


Без кода трудно диагностировать проблему. Фактическое расположение пикселей выглядит правильным для этого алгоритма. Однако похоже, что вы используете проекционную матрицу, которая не переводит мировое пространство непосредственно в пространство экрана.

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

person Bob Cross    schedule 28.02.2011

Судя по вашему jpeg, интересно, то, что вы считаете одним пикселем в мировом пространстве, на самом деле таковым не является. Возможно, ваша проекционная матрица работает не совсем так, как вы думаете.

GL_POINT_SMOOTH включен? -- Возможно, это что-то портит. Эти пиксели выглядят странно круглыми.

Предполагая, что использование этого алгоритма важно для вас (и вас не интересуют методы, которые могут быть более эффективными), вы можете нарисовать четырехугольник для каждого «пикселя» вместо использования GL_POINTS.

person Martin Stone    schedule 28.02.2011

используйте метод sin/cos, тогда вы можете рисовать линии из одной точки в другую, также он позволяет вам изменять детализацию многоугольника, не говоря уже о том, что гораздо проще заполнить круг (рисовать треугольники от середины к краям).

если вы используете более высокую детализацию, результат будет почти таким же, как у Брезенхэма.

person Rookie    schedule 28.02.2011
comment
-1: ОП, скорее всего, должен использовать алгоритм Брезенхэма именно из-за требований класса. Так что это на самом деле не отвечает на вопрос. - person Omnifarious; 28.02.2011