|
||||
|
Мысли о FSAAПопытка описать то, каким должно быть ... это сглаживание. ! ЧЕРНОВИК ! С О Д Е Р Ж А Н И Е
|
||||||||||||||||
Цель статьи - рассмотреть достаточно простой вопрос "а нужно ли нам FSAA?".
Да, эффект, производимый AA(antialiasing) очень сильно повышает качество изображения,
но падение производительности ....
Попробую ответить на этот вопрос ...
Попытаюсь рассмотреть, что можно сделать, чтобы на мониторе была не просто
"красиво", а "естественно".
Идея метода.
В процессе формирования изображения, на некоторой стадии происходит преобразование фигур
(чаще - треугольников) в точки изображения. Причем, в конечной стадии это вырождается в формирование
отрезков.
Описание
Хочу специально подчеркнуть - это не метод сглаживания! Производимый эффект сглаживания краев
изображения - побочный эффект. Основа метода - точное позиционирование изображения на экране,
впрочем, ... я подробно рассказал об этом в начале.
достоинства/недостатки
К достоинствам предложенного метода относится:
Демонстрационная программа
Решения ...
Позже, как будет время ...
Интересное наблюдение - на экране телевизора фильмы, как и игры, смотрятся
совсем не так, как на мониторе. В чем дело? У монитора разрешение больше 1024
линий, а обычный телевизор лучше 400 линий вряд-ли сможет показать.
Так, почему же телевизор, при несопоставимо худших параметрах показывает лучше??
1) у монитора вывод изображения строго в сетке (например, для 1024*768 это будет
1024 точек в строке на 768 строк), у телевизора - фиксированное число строк без
фиксации количества точек в строке.
2) у монитора графическое изображение может занимать от 1 и больше точек, у телевизора
это "виртуальное" число как минимум распространяется на несколько "точек".
Термины "виртуальное" и "точек" поставлено в кавычки потому, что эти параметры для
телевизора отсутствуют.
3) быстрое движение на телевизоре смазывается, на мониторе ...
4) при удалении об'екта на телевизоре изображение теряет фокус (что естественно!),
на мониторе - сохраняет четкие границы в 1 пиксель.
5) у телевизора все изображение как-бы "не в фокусе", только в разной степени,
у монитора - соседние пикселы выводятся четко, взаимное попадание цвета в соседних
пикселах отсутствует.
6) у монитора есть aliasing ... впрочем, пока достаточно.
Дело в том, что у телевизора при плохой четкости нет дискретности. Это настолько важно,
что я специально прошу обратить на это внимание, отсутствие дискретности - принципиальное
отличие телевизора от монитора.
Как комментарий к этому один пример - очень тонкая вертикальная линия в центре экрана и
рассмотрим, что будет происходить при медленном перемещении ее к краю.
Для телевизора: линия будет достаточно "толстой" и будет перемещаться без каких-либо дефектов,
для монитора: линия займет 1 пиксель и перемещение будет сопровождаться щелчками(дискретностью)
перемещения. Какой из двух представлений понравится больше?
Т.о., можно сказать, что изображение на экране монитора обладает следующими дефектами:
- неточностью статического положения пиксела
- неточностью динамического положения пиксела
- триггерный эффект перемещения
Все эти дефекты получаются из того факта, что дискретность положения изображения равна его
минимальному значению (один пиксель). Для телевизора это не так - размер дискретности много-много
меньше, чем его четкость.
Т.е., что-бы улучшить изображение на мониторе, надо сломать это равенство -
размер точки = дискретности координат. Возникает вопрос - КАК?
Один из способов - использование низкокачественных мониторов с высоким разрешением и частотой
развертки(полный антипод современным LCD мониторам). Да, играть на таком хорошо, а вот пользоваться
им как монитором .... проще сразу купить очки - гарантированное нарушение зрения.
И что остается?
Да! Если Вы думаете, что я уклонился от темы ..... читайте дальше.
Один из возможных вариантов - нужно точно выводить пикселы. Т.е. при формировании 3D изображения
нужно исключить какое-либо округление и выводить все точки точно.
Существуют и другие приемы на похожем принципе, например - динамическое сглаживание. Но, при более
простой реализации он имеет несколько худшие параметры ... впрочем, о нем как-нибудь в другой раз.
Рассмотрим подробнее:
Надо разбить отрезок на точки. Положим, что отрезок строго горизонтальный, это не принципиально.
Что сразу напрашивается - все точки внутри отрезка будут строго в сетке, а "не в сетке" будут
только начальная и конечная точка. Вообще говоря, "не в сетке" точки внутри отрезка быть не могут
- иначе "дискретность" изображения будет распространяться не только на края изображения, но и на
все изображение. То, что точки идут "по сетке" - это не плохо, ведь от этих, подчеркиваю -
точных положений отсчитывается ее текстурирование и видимость на экране.
Теперь - краевые точки, как быть с ними?
Тут и есть все то зло, что делает картинку неестественной.
Как преобразовать неточные координаты точки?
Для этого раньше применялось краевое сглаживание, но проблемы совмещения полигонов исключают
применение этой технологии сейчас - никто не потерпит просвечивание одних изображений через щели
других.
Другой способ - вначале формировать изображение в несколько раз больше, а при выводе на экран
изображение уменьшать, т.е. в формировании одной точки на экране участвует несколько точек в буфере.
Недостатки этого "метода" очевидны - огромная нагрузка на видеокарту и соответствующее падение скорости
формирования изображения. Самый низкокачественный из этих методов FSAA преобразует из 4х точек
в буфере одну точку на экране. Изображение становится лучше, но при трехкратном падении скорости.
Т.е. только при очень слабом процессоре и очень-очень мощной видеокарте можно позволить себе такую
роскошь, как FSAA .... да и то, только на очень старых и нетребовательных игрушкам.
Что же делать? Изображение надо сглаживать, и это не зависит от разрешения монитора, и для 1600*1200.
.... к сути метода.
Идея заключается в том, что к описанию пиксела добавляется новая компонента Delta.
Т.е. на каждую точку есть следующие описания:
- цвета R, G, B
- прозрачность
- номер строки
- номер позиции в строке
К ним добавляется еще и Delta - остаток округления от номера строки и номера позиции в строке.
Delta получается в момент вычисления координат и не принимает участие в каких-либо вычислениях
цвета и видимости пиксела. Впрочем, об этом во второй части. Для упрощения положим, что эта
компонента просто лежит без изменения.
Как я говорил выше, Delta для точек внутри отрезка будет = 0, ведь отрезок разбивается на точки
строго "в сетке" и проблемными будут именно те самые краевые точки.
После формирования пиксела и выяснения видимости его на экране, производится запись его в видеобуфер.
Причем, записываются следующие компоненты:
- цвета R, G, B
- прозрачность не записывается
- на место прозрачности записывается Delta
Если пиксель уже записан на экран, то параметр "прозрачность" ему уже не нужен и туда можно поместить
Delta.
Т.о., никаких существенных изменений в алгоритмах работы видеокарты и 3D API не происходит, все выполняется обычным способом.
Для точного позиционирования этих проблемных точек применяется достаточно простой прием -
если точка смещена в сторону другой точки, то при формировании ее цвета и цвета той точки
выполняется взаимное смешивание цветов, пропорциональное величине смещения от сетки.
Впрочем, может быть и нелинейная зависимость.
Подобное преобразование цветов может быть выполнено двумя способами, впрочем .... можно придумать и больше.
a) заводится специальный конвейер, считывающий входной буфер и записывающий новый. Или - записывающий поверх старого.
b) при при выводе точки на экран монитора считывать 5 точек (текущая, X+1/Y, X-1/Y, X/Y+1, X/Y-1)
и по ним вычислять цвет выводимой точки.
Первый вариант меньше нагружает память, ведь нужно только одно чтение при достаточно редких перезаписях,
второй - потенциально более качественное изображение и, возможно, лучшую совместимость с существующим
аппаратным обеспечением.
- отсутствие каких-либо искажений текста без специального программного управления, ведь он
выводится строго по сетке.
- нет необходимости формировать большее изображение с последующим уменьшением - достижимы
и высокие разрешения изображения порядка 1600*1200 и выше.
- падение скорости не столь фатально.
- и самое главное - изображение выводится точно, что принципиально улучшает изображение в динамике.
К сожалению, никакими иллюстрациями нельзя описать динамику, так что .... сделал небольшую программу,
показывающую эффект метода.
Hotkey:
s - включение/выключение желтых линий
space - пауза/движение
0 - обычный режим
1,2,3 - предложенный метод с разной степенью аппроксимации.
ESС - выход.
Ограничение программы - запускается только на видеокартах от NVidia и только в реальном режиме процессора. Последнее можно получить путем загрузки с дискеты без config.sys или под Windows9x
по пункту "Safe mode command promt only".
Эти ограничения вызваны тем фактом, что я выполняю прямую запись в память видеокарты.
Да! На линиях есть некоторые мелкие дефекты - это не недостаток метода, а мои ошибки округления.
Надо было применять FPU.
Впрочем, я бы исправил, но это несущественный дефект.
генерация идеи - 20 мая 2002 года
программа - 27 мая 2002 года
начало статьи - 5 июня 2002 года