TestMem: other

TestMem techsupport home page

home      news      software      other      links      contact


 

Все обо всем ...

Не тесты памяти

Модемный фильтр.

Кое-что о блоках питания.

Активная нагрузка.

Приколы.

Мысли о FSAA

Мысли о 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 года

back