Текстуры. Фильтрация, мипмаппинг.
Что есть текстура, друг? Текстура, грубо говоря, - это картинка наложенная на какую-либо поверхность. Все картинки состоят из пикселей - дискретный элемент, из которых формируется изображение. Каждый пиксель занимает на экране небольшую прямоугольную область, которая в любой момент времени отображается в одном цвете. Т.к. пиксели имеют цвет, было бы разумным поговорить о различных цветовых моделях.
Код | Bool ColorSystems() { char* cs_name=”Unknown”; cs_name=”RGB”; printallabout(cs_name);
|
Самая простая и распространенная цветовая модель. RGB - RED GREEN BLUE . При работе с этой системой надо указывать три параметра, которые означают, как бы количество краски одного из трёх цветов, добавляемое для смешивания. Например, 0 0 0 - чёрный цвет, мы не добавляли никакой краски; 1 1 1 - белый цвет, мы добавили всех красок поравну, чем меньше будет значение той или иной краски, тем темнее будет общий цвет; 0.5 0.5 0.5 - серый; 1 0 0 - красный. Так же возможна градация не от 0 до 1, а от 0 до 255, принцип один и тот же.
Код | cs_name=”YCbCr”; printallabout(cs_name);
|
Y - яркость, Cb - задание синевы, Cr - задание красноты. Эту цветовую модель, например, использует, формат JPEG, при сохранение файла. По сути, главным в этой системе является компонент Y - он является полутоновым представлением цветного изображения. Если в RGB системе все компоненты примерно равнозначны, то в YcbCr - нет.
Код | cs_name=”CMYK”; printallabout(cs_name);
|
CMYK - CYAN MAGENTA YELLOW BLACK. Голубой, фиолетовый, жёлтый, чёрный. Тут надо отметить, что если будут значения 1 1 1 1 - чёрный цвет, 0 0 0 0 - белый. Здесь всё также предельно просто, как и с RGB
Код | cs_name=”L*a*b”; printallabout(cs_name);
|
Эта модель разрабатывалась специально для человеческого глаза. Короче собралась толпа умных динозавров, вроде тех что сидели за TX-2, и решили стандартизировать наше восприятие цвета. Результатом их жизнедеятельности явилась эта цветовая модель, которая, надо отметить, является самой мощной из всех выше описанных. В ней есть цвета, которых нет в предыдущих моделях. Единственная проблема этой модели - её понимание: L - означает яркость, а a и b - хроматические компоненты (a - от зелёного к красному, b - от синего к жёлтому)
Код | cs_name=”HSB”; printallabout(cs_name);
|
Этой моделью пользуются, в основном художники. Она очень удобна в использовании. H - это сам цвет, цветовой тон. S - насыщенность, процент добавления к цвету белой краски. В - яркость - процент добавления к цвету чёрной краски.
Код | if (all_mind_correct()) return true; else ColorSystems(); }
|
-----------------------------------------------------------------------------------------
Код | bool Texturing(__int64 users_count) { char* filter=”Unknown”; if (users_count<65536) return; filter=”pointed”;//Точечное текстурирование printallabout(filter);
|
Точечное текстурирование является, пожалуй, основным видом текстурирования. При точечном текстурировании выбирается отдельный фрагмент текстуры и используется, как цветовое значения для пикселей. Такое изображение при существующих стандартах уже просто неприемлемо. Именно благодаря этому виду фильтрации мы можем созерцать огромный ПИКСЕЛИ - квадраты, на стенах в играх.
Код | filter=”bilinear”;//Билинейная фильтрация printallabout(filter);
|
Билинейная фильтрация - один из методов текстурирования, а не способ сглаживания текстур!!! Принцип действия этого метода текстурирования очень похож на точечный метод, но в отличие от него для выбора цвета пикселей используется не полное изображение, а блок из 4 текселей. Таким образом, повышается аккуратность при выборе цвета пикселя и достигается лучшая прорисовка отдельных мелких деталей изображения.
Код | filter=”trillinear”;//Трилинейная фильтрация. printallabout(filter);
|
Второе рождение билинейная фильтрация получила в виде трилинейной фильтрации, принцип действия которой точно такой же, но используется улучшенный алгоритм расчета, который увеличивает точность прорисовки. Трилиниейная фильтрация, как и билинейная, использует блоки из 4 текселей, также как и в билинейной фильтрации, нормализуется изображение, затем нормализуется изображение из граничного блока из 4 текселей. Последним этапом производится анализ границы обоих блоков, в результате которого исправляются возможные ошибки и несоответствия на границе этих 2 блоков. В билинейной фильтрации достаточно часто можно увидеть линии, возникающие на границах блоков, которые исчезают при использовании трилинейной фильтрации. Кроме того, при использовании трилинейной фильтрации лучше убираются искажения и неровности при движении и при изменении угла зрения. Следует обратить внимание, что некоторые дефекты на приличной дистанции возникают даже при использовании трилинейной фильтрации. Изображение получается очень качественно только при более прямых углах зрения, при реальной же прорисовке, геометрические формы объекта могут быть нарушены.
Код | filter=”anisotropic”;//Анизотропная фильтрация printallabout(filter);
|
Форма текстурированных объектов как при билинейной, так и при трилинейной фильтрации может искажаться, т.к. обе эти фильтрации являются изотропными - изображение фильтруется в определенной форме - в форме квадрата. Большинство же формируемых объектов не подходят под эту определенную и неизменную форму: для их качественной обработки необходимо использовать другой тип фильтрации - анизотропный. Анизотропная фильтрация обычно оперирует не менее чем 8 текселями, во все стороны mip-map уровней, при этом используется модель неопределенной заранее формы. В результате убираются шумы и искажения объектов, а изображение в целом получается более качественным.
Код | if (all_mind_correct()) return true; else Texturing(++users_count); }
|
-----------------------------------------------------------------------------------------
Код | bool MipMapping() { if (!(ColorSystems() && Texturing())) return; else printallabout(“mipmapping”);
|
Что если мы смотрим на объект под каким-то углом, к примеру, на пол? Пол может занимать большую площадь, и для сохранения реалистичности, чем дальше он от нас, тем меньше его составляющие (к примеру, плитка). Для обеспечения этого, текстура должна определенным образом уменьшаться. К сожалению, простое изменение разрешения текстур, может повлечь за собой довольно неприятный эффект, когда одна текстура визуально как бы сливается с другой. Другой неприятный эффект может возникнуть, если тексель больше размером, чем требуемое количество пикселей. Это происходит, когда смотришь на текстуру, находящуюся на очень большом расстоянии. Для смягчения таких ситуаций и был создан mip-mapping (мип-маппинг). Эта технология работает очень просто: оригинальная текстура генерируется в различных ситуациях таким образом, чтобы корректно отображать текстуру на разных расстояниях и при разных углах зрения. При приближении к объекту показывается текстура с более высоким разрешением, а при отдалении - с низким. Таким образом, mip-mapping улучшает качество изображения и уменьшает неровности.
Код | if (all_mind_correct()) return true; else MipMapping(); }
| |