Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Теория текстурирования


Автор: gepard 9.3.2004, 10:08
Текстуры. Фильтрация, мипмаппинг.

Что есть текстура, друг? Текстура, грубо говоря, - это картинка наложенная на какую-либо поверхность. Все картинки состоят из пикселей - дискретный элемент, из которых формируется изображение. Каждый пиксель занимает на экране небольшую прямоугольную область, которая в любой момент времени отображается в одном цвете. Т.к. пиксели имеют цвет, было бы разумным поговорить о различных цветовых моделях.
Код

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();
}

Автор: mr.DUDA 9.3.2004, 10:38
gepard, а куски "кода" - это что такое smile.gif ?...
А так ничаво даже статья.
Можно было б в FAQ по технологиям кидануть, имхо.

Автор: gepard 9.3.2004, 10:45
Цитата
gepard, а куски "кода" - это что такое

Ничего ты не понял. Осмысли названия функций и значения присваеваемые переменным.

Автор: mr.DUDA 9.3.2004, 10:57
Цитата
Ничего ты не понял. Осмысли названия функций и значения присваеваемые переменным.

да понял я, понял с первого раза smile.gif
просто не очень удобно читать...

Автор: gepard 9.3.2004, 11:09
Цитата
просто не очень удобно читать...

Мы программисты, нам не превыкать. Зато неоднообразно и непресно.

Автор: Kesh 9.3.2004, 12:58
Хорошая статья... Все просто и понятно... Но вот код... Тогда уж на русском их называй...

Автор: gepard 10.3.2004, 08:47
Цитата
Но вот код... Тогда уж на русском их называй...

Запомню на будущее.

Автор: Kesh 10.3.2004, 14:18
gepard да я не со зла, просто действительно неудобно читать...

P.S. А статья и правда классная

Автор: gepard 11.3.2004, 11:02
Я рад, что хоть кто-то ценит. Считаю жизнь прожил не зря smile.gif.

Автор: gepard 11.3.2004, 12:18
Цитата
gepard да я не со зла

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

Автор: Костян 12.8.2004, 13:19
Напишишь статейку. http://www.e-brain.nm.ru

Автор: Domestic Cat 13.8.2004, 15:33
Цитата
Точечное текстурирование является, пожалуй, основным видом текстурирования. При точечном текстурировании выбирается отдельный фрагмент текстуры и используется, как цветовое значения для пикселей. Такое изображение при существующих стандартах уже просто неприемлемо.


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

Кстати неплохо было бы дописать уравнения текстуры, получилось бы лучше.
Как и алгоритмы для билинейной и трилинейной фильтрации.

А вообще хорошо smile.gif

Автор: gepard 14.8.2004, 08:57
Domestic Cat
Если тебе интересно - есть ещё одна статья: http://forum.vingrad.ru/index.php?showtopic=19847

Автор: Ignat 16.8.2004, 14:26
К модераторам и лично к December'у:
жалко будет если тема затеряется... может переместите куда-нибудь? Так чтобы на виду была.

Автор: PILOT 16.8.2004, 14:36
А что такое ТЕКСЕЛЬ?
Цитата
блок из 4 текселей


СУВ.

Автор: LSD 16.8.2004, 20:28
Цитата(PILOT @ 16.8.2004, 14:36)
А что такое ТЕКСЕЛЬ?

По моему это объемный спрайт или текстура, если не путаю.

Автор: Domestic Cat 16.8.2004, 20:55
Тексель - это пиксель текстуры. Называют его так потому, что при маппинге текстуры на
полигон и проецировании eго на экран, один тексель может соответствовать различному
количествy пикселей экрана; например, когда полигон близко, тексель реально займет гораздо больше места, чем пихель.

Автор: p0s0l 17.8.2004, 22:53
И я попробую высказать свои скромные комментарии по поводу статьи:

Цитата
Текстура, грубо говоря, - это картинка наложенная на какую-либо поверхность.

Это картинка, накладываемая на поверхность... Наложенная - это уже значит, всяко повёрнутая и изогнутая и т.д. (ИМХО)...

Также следовало где-нибудь вначале прояснить термины:
Пиксель = Pixel = Picture Element - "элемент картинки"
Тексель = Texel = Texture Element - "элемент текстуры"
Текселю на экране может соответствовать несколько пикселей (когда поверхность близко находится к камере), и наоборот - одному пикселю может соответствовать несколько текселей (если поверхность находится далеко)...

Цитата
Билинейная фильтрация - один из методов текстурирования, а не способ сглаживания текстур!!!
А что является способами сглаживания ?...

Также, для интересности, можно было бы расшифровать слово "MIP" (много в одном), правда, я не помню, как это звучит (вроде на латыни)...

А так, в целом, статья понравилась, стиль изложения тоже. Жду продолжения!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)