#c #opengl
#c #opengl
Вопрос:
Я рисую множество маленьких черных прямоугольников на белом экране, и когда они перемещаются и масштабируются, это выглядит не очень изящно.
Как я могу нарисовать их так, чтобы, если граница проходила между пикселями, пиксели были серыми, а не черными?
Комментарии:
1. Как вы рисуете прямоугольники?
Ответ №1:
Подпиксельная отрисовка на самом деле сложнее, чем обычное сглаживание. Если вы используете дисплей с пикселями в формате RGB, то серая фигура, заканчивающаяся на середине пикселя, может отображаться как желтая или голубая, в зависимости от того, с какой стороны от пикселя расположена фигура. Это может выглядеть странно, когда результирующее изображение отрисовывается не в собственном разрешении или на дисплее с другим расположением, чем ожидалось, но в остальном это может выглядеть довольно красиво.
Вот пример субпиксельного рендеринга, применяемого к тексту; левая панель — цвет, центральная панель — отображаемая версия цвета, а правая панель — воспринимаемая яркость. Обратите внимание, что точность оттенка заменяется точностью яркости.
Одним из подходов может быть рендеринг каждого канала отдельно, каждый из которых слегка смещен в пространстве рендеринга на соответствующую величину, чтобы объединенное изображение было полноцветным. Каждый из каналов должен иметь то же разрешение, что и результирующее изображение; каждый канал отображается со сглаживанием так же, как и оригинал, за исключением того, что другие цвета игнорируются. Как только каналы созданы, их можно объединить простым добавлением. Я не знаю о «чистом» решении, подобном версиям glEnable / glHint, доступным для обычного сглаживания, но оно может существовать или может появиться в будущем.
Ответ №2:
glEnable(GL_SMOOTH);
должно получиться.
Комментарии:
1. Гладкие полигоны доступны не во всех реализациях. Кроме того, они утомительны в использовании. Вместо этого я бы рекомендовал мультисэмплинг.
2. @datenwolf: Но мы не говорим о произвольных полигонах. Я ожидал бы, что будут поддерживаться прямоугольники (и при необходимости их всегда можно нарисовать в виде пары треугольников).
3. Замените «полигон» на «заполненные примитивы». OpenGL называет это сглаживанием полигонов, но это применимо и к треугольникам и квадратикам. В любом случае, использовать плавный режим утомительно.
4. @datenwolf: Какая реализация не поддерживает сглаживание треугольников? AFAICT эта функция существует уже очень давно и не устарела в версии 3 , поэтому она должна быть доступна практически повсеместно.
5. В некоторых (более старых) реализациях этого просто нет (края остаются неровными), некоторые реализуют это, рисуя линии по краям с дрожащими конечными точками. В целом, POLYGON_SMOOTH — это зло. Мультисэмплы обеспечивают гораздо лучшее качество и их проще использовать.
Ответ №3:
То, о чем вы фактически просите, это anti-aliasing
, и существует множество способов сделать это. В этом разделе gamedev кратко описан один из способов: http://www.gamedev.net/topic/107637-glenablegl_polygon_smooth /.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_POINT_SMOOTH, GL_NICEST);
glHint(GL_LINE_SMOOTH, GL_NICEST);
glHint(GL_POLYGON_SMOOTH, GL_NICEST);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
Комментарии:
1. Я попробовал это, и блоки все еще перемещаются на пиксель за раз. Я попытался разделить на два треугольника, и это все еще происходит