На диаграмме (рис. 14.1) показаны результаты попытки нарисовать серый объект. Предполагаемая форма объекта показана на рис. 14.1, а. Из-за ограничения компьютерного экрана на объект накладывается сетка, каждая ячейка которой может быть окрашена только в один цвет (точечная дискретизация). Обозначим два разных цвета кружочками (рис. 14.1, б). В результате получатся некрасивые зубцы (рис. 14.1, в). (Рисунок немного упрощен, так как обычный CRT-монитор не показывает пикселы правильными квадратиками, но дефекты изображения видны и в том случае, если пикселы показаны перекрывающимися кругами.)

Дефекты изображения (алиасинг): а - серой областью обозначена форма объекта; б- изображение на экране показано в виде пикселов, на объект наложена сетка; в- результат наложения сетки показан в виде зубцов

Рис. 14.1. Дефекты изображения (алиасинг): а - серой областью обозначена форма объекта; б- изображение на экране показано в виде пикселов, на объект наложена сетка; в- результат наложения сетки показан в виде зубцов Алиасинг вызывают и другие причины. Если создается анимация и объекты неправильно дискретизированы в движении, можно говорить о временном алиасинге. Так получается, если движение объекта слишком быстрое для выбранной частоты дискретизации. Объекты могут дергаться или мигать. Классический пример временного алиасинга - движущийся вперед автомобиль (карета, фургон, велосипед), колеса которого крутятся назад. Это происходит потому, что частота кадров (количество в секунду) слишком низкая по сравнению со скоростью вращения колес. В реальности колесо может делать пол-оборота или три четверти оборота вперед за один кадр, но на экране это будет выглядеть так, как будто колесо повернулось на четверть оборота назад.

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

4.2. Избежание алиасинга

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

Например, если известно, что какой-либо объект в окончательном изображении всегда будет одного и того же размера, можно создать шейдер, который будет хорошо рисовать объект именно этого размера. Такой способ был описан ранее в этой книге при демонстрации некоторых шейдеров. Функции smoothstep, mix и cl ашр особенно полезны, так как позволяют избавиться от резких переходов и помогают показывать процедурную текстуру корректно при любом масштабе.

Алиасинг зачастую возникает, если рендеринг объекта выполняется для разных его размеров. Множественные текстуры придумали именно для этого, и нечто подобное можно сделать и в шейдерах. Если точно известно, что на изображении объект будет появляться с разными размерами, можно создать отдельный шейдер для каждого размера. Каждый из этих шейдеров будет рисовать объект с правильным уровнем детализации, что позволит избежать алиасинга. Чтобы этот способ работал, приложение должно знать приблизительный размер объекта еще до начала рисования и в соответствии с этим устанавливать нужный шейдер. Даже если размеры объекта на анимации плавно увеличиваются или уменьшаются, некоторые погрешности при смене уровня детализации все равно возникнут.

В некоторых случаях алиасинга можно избежать, используя текстуру вместо процедурных вычислений (см. главу 11). Это позволяет использовать возможности антиалиасинга, заложенные в текстурные аппаратные модули.


⇐ вернуться назад | | далее ⇒