Субпиксельное рисование с OpenGL - PullRequest
3 голосов
/ 12 апреля 2011

Я рисую множество маленьких черных прямоугольников на белом экране, и когда они двигаются и увеличивают масштаб, он не выглядит очень изящным.пиксели будут серыми, а не черными?

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

То, что вы фактически запрашиваете - это anti-aliasing, и существует множество способов сделать это. Один из способов описан в этой теме: 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 голос
/ 25 августа 2016

Субпиксельный рендеринг на самом деле сложнее, чем обычное сглаживание. Если вы используете дисплей с пикселями в формате RGB, то серая фигура, заканчивающаяся на полпути через пиксель, может быть представлена ​​как желтая или как голубая, в зависимости от того, с какой стороны пикселя находится фигура. Это может выглядеть странно, когда полученное изображение не отображается в собственном разрешении или на дисплее с макетом, отличным от ожидаемого, но в остальном это может выглядеть довольно красиво.

Subpixel rendering applied to text

Вот пример субпиксельного рендеринга, примененного к тексту; левая панель - цветная, центральная панель - отображаемая версия цвета, а правая панель - воспринимаемая яркость. Обратите внимание, что точность оттенка меняется на точность яркости.

Один из подходов может состоять в том, чтобы визуализировать каждый канал отдельно, слегка смещая пространство рендеринга на соответствующую величину, чтобы объединенное изображение было полноцветным. Каждый из каналов должен иметь то же разрешение, что и результирующее изображение; каждый канал обрабатывается сглаживанием так же, как оригинал, за исключением того, что другие цвета игнорируются. Как только каналы созданы, их можно объединить с помощью простого добавления. Я не знаю такого «чистого» решения, как версии glEnable / glHint, доступные для обычного сглаживания, но оно может существовать или может появиться в будущем.

0 голосов
/ 12 апреля 2011

glEnable(GL_SMOOTH); должен это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...