Мип текстурирование. Мип это. Для дальнейшего изучения

Для Symbian 08.04.2019

MIP-текстурирование (MIP mapping) - метод текстурирования, использующий несколько копий одной текстуры с разной детализацией. Название происходит от multum in parvo - «много в малом».

Назначение

Изображение лучше всего выглядит, когда детализация текстуры близка к разрешению экрана. Если разрешение экрана высокое (текстура слишком маленькая/объект очень близко), получается размытое изображение. Если же разрешение текстуры слишком высокое (текстура слишком велика/объект очень далеко), получаем случайные пиксели - а значит, потерю мелких деталей, мерцание и большой процент промахов в кэш. Получается, что лучше иметь несколько текстур разной детализации и накладывать на объект ту, которая наиболее подходит в данной ситуации.

Принцип действия

Создаётся так называемая MIP-пирамида - последовательность текстур с разрешением от максимального до 1×1. Например: 1×1, 2×2, 4×4, 8×8, 16×16, 32×32, 64×64, 128×128, 256×256, 512×512 и 1024×1024. Каждая из этих текстур называется MIP-уровнем (MIP level) или уровнем детализации (level of detail).

Недостатки, способы решения

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

MIP-текстурирование не решает проблему текстур, находящихся под острым углом к зрителю (например, дорога в автосимуляторе). У таких текстур разрешение по одной оси сильно отличается от разрешения по другой - и, например, по оси X изображение явно размыто, в то время как по оси Y видны мерцания, свойственные завышенному разрешению текстуры. Есть сразу несколько способов решения этого (начиная с наименее качественного):

  1. Установить в видеодрайвере наиболее комфортное значение mip bias - числа́, которое отвечает за выбор номера текстуры в пирамиде. Если оно отрицательное, видеоплата берёт более детальные текстуры, если положительное - менее детальные.
  2. Многие игры сами устанавливают подходящий mip bias для разных типов объектов. Например, в Live for Speed mip bias устанавливается пользователем отдельно для автомобилей, препятствий и дороги.
  3. Воспользоваться
multum in parvo - «много в малом».

Назначение

Изображение лучше всего выглядит, когда детализация текстуры близка к разрешению экрана. Если разрешение экрана высокое (текстура слишком маленькая/объект очень близко), получается размытое изображение. Если же разрешение текстуры слишком высокое (текстура слишком велика/объект очень далеко), получаем случайные пиксели - а значит, потерю мелких деталей, муар , мерцание и большой процент кэш-промахов . Получается, что лучше иметь несколько текстур разной детализации и накладывать на объект ту, которая наиболее подходит в данной ситуации.

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

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

Принцип действия

Создаётся так называемая MIP-пирамида - последовательность текстур с разрешением от максимального до 1×1. Например: 1×1, 2×2, 4×4, 8×8, 16×16, 32×32, 64×64, 128×128, 256×256, 512×512 и 1024×1024. Каждая из этих текстур называется MIP-уровнем (англ. MIP level ) или уровнем детализации (англ. level of detail ).

На всех этих текстурах находится одно и то же изображение. Таким образом, MIP-текстурирование увеличивает расход видеопамяти на треть:

\sum_{i=0}^\infty \left(\frac 1 4 \right)^i = 1 \frac 1 3.

При наложении текстур вычисляется расстояние до объекта и номер текстуры находится по формуле:

{miplevel} = \log_2 \left(\frac Шаблон:Dist {{texelsize} \cdot {resolution}} \right) + {mipbias},

где resolution - разрешение виртуальной камеры (количество пикселей, которое будет в объекте размером в 1 ед., расположенном в 1 ед. от камеры), texelsize - размер текселя в единицах трёхмерного мира, dist - расстояние до объекта в тех же единицах, mip bias - число, позволяющее выбирать более или менее детальную текстуру, чем даёт формула.

Эта цифра округляется до целого, и текстура с соответствующим номером (нулевая - самая детальная, первая - вдвое меньшая и т. д.) накладывается на объект.

Недостатки, способы решения

MIP-текстурирование не решает проблему текстур, находящихся под острым углом к зрителю (например, дорога в автосимуляторе). У таких текстур разрешение по одной оси сильно отличается от разрешения по другой - и, например, по оси X изображение явно размыто, в то время как по оси Y видны мерцания, свойственные завышенному разрешению текстуры. Есть сразу несколько способов решения этого (начиная с наименее качественного):

  1. Установить в видеодрайвере наиболее комфортное значение mip bias - числа́, которое отвечает за выбор номера текстуры в пирамиде. Если оно отрицательное, видеоплата берёт более детальные текстуры, если положительное - менее детальные.
  2. Многие игры сами устанавливают подходящий mip bias для разных типов объектов. Например, в Live for Speed mip bias устанавливается пользователем отдельно для автомобилей, препятствий и дороги.
  3. Воспользоваться анизотропной фильтрацией - методом текстурирования, который направлен именно на решение этой проблемы.

Наконец, видна чёткая граница между MIP-уровнями. Это решается трилинейной фильтрацией .

Альтернативы

В рендерерах высокого качества может применяться таблица частичных сумм . Это даёт высшее качество изображения (за четыре обращения к таблице можно усреднить цвет по любому прямоугольнику), но для хранения сумм нужны более широкие типы. Соответственно, таблица частичных сумм больше не на треть, а как минимум вдвое. Проблем с кэш-промахами таблица частичных сумм не решает.

Напишите отзыв о статье "MIP-текстурирование"

Ссылки

  • Михаил Хабров. . GameDev.ru (29 мая 2002 года). Проверено 12 июля 2009. .
  • (1983) (англ.)

Отрывок, характеризующий MIP-текстурирование

И она, как всегда говоря о Пьере, стала рассказывать анекдоты о его рассеянности, анекдоты, которые даже выдумывали на него.
– Вы знаете, я поверил ему нашу тайну, – сказал князь Андрей. – Я знаю его с детства. Это золотое сердце. Я вас прошу, Натали, – сказал он вдруг серьезно; – я уеду, Бог знает, что может случиться. Вы можете разлю… Ну, знаю, что я не должен говорить об этом. Одно, – чтобы ни случилось с вами, когда меня не будет…
– Что ж случится?…
– Какое бы горе ни было, – продолжал князь Андрей, – я вас прошу, m lle Sophie, что бы ни случилось, обратитесь к нему одному за советом и помощью. Это самый рассеянный и смешной человек, но самое золотое сердце.
Ни отец и мать, ни Соня, ни сам князь Андрей не могли предвидеть того, как подействует на Наташу расставанье с ее женихом. Красная и взволнованная, с сухими глазами, она ходила этот день по дому, занимаясь самыми ничтожными делами, как будто не понимая того, что ожидает ее. Она не плакала и в ту минуту, как он, прощаясь, последний раз поцеловал ее руку. – Не уезжайте! – только проговорила она ему таким голосом, который заставил его задуматься о том, не нужно ли ему действительно остаться и который он долго помнил после этого. Когда он уехал, она тоже не плакала; но несколько дней она не плача сидела в своей комнате, не интересовалась ничем и только говорила иногда: – Ах, зачем он уехал!
Но через две недели после его отъезда, она так же неожиданно для окружающих ее, очнулась от своей нравственной болезни, стала такая же как прежде, но только с измененной нравственной физиогномией, как дети с другим лицом встают с постели после продолжительной болезни.

Здоровье и характер князя Николая Андреича Болконского, в этот последний год после отъезда сына, очень ослабели. Он сделался еще более раздражителен, чем прежде, и все вспышки его беспричинного гнева большей частью обрушивались на княжне Марье. Он как будто старательно изыскивал все больные места ее, чтобы как можно жесточе нравственно мучить ее. У княжны Марьи были две страсти и потому две радости: племянник Николушка и религия, и обе были любимыми темами нападений и насмешек князя. О чем бы ни заговорили, он сводил разговор на суеверия старых девок или на баловство и порчу детей. – «Тебе хочется его (Николеньку) сделать такой же старой девкой, как ты сама; напрасно: князю Андрею нужно сына, а не девку», говорил он. Или, обращаясь к mademoiselle Bourime, он спрашивал ее при княжне Марье, как ей нравятся наши попы и образа, и шутил…
Он беспрестанно больно оскорблял княжну Марью, но дочь даже не делала усилий над собой, чтобы прощать его. Разве мог он быть виноват перед нею, и разве мог отец ее, который, она всё таки знала это, любил ее, быть несправедливым? Да и что такое справедливость? Княжна никогда не думала об этом гордом слове: «справедливость». Все сложные законы человечества сосредоточивались для нее в одном простом и ясном законе – в законе любви и самоотвержения, преподанном нам Тем, Который с любовью страдал за человечество, когда сам он – Бог. Что ей было за дело до справедливости или несправедливости других людей? Ей надо было самой страдать и любить, и это она делала.
Зимой в Лысые Горы приезжал князь Андрей, был весел, кроток и нежен, каким его давно не видала княжна Марья. Она предчувствовала, что с ним что то случилось, но он не сказал ничего княжне Марье о своей любви. Перед отъездом князь Андрей долго беседовал о чем то с отцом и княжна Марья заметила, что перед отъездом оба были недовольны друг другом.
Вскоре после отъезда князя Андрея, княжна Марья писала из Лысых Гор в Петербург своему другу Жюли Карагиной, которую княжна Марья мечтала, как мечтают всегда девушки, выдать за своего брата, и которая в это время была в трауре по случаю смерти своего брата, убитого в Турции.
«Горести, видно, общий удел наш, милый и нежный друг Julieie».
«Ваша потеря так ужасна, что я иначе не могу себе объяснить ее, как особенную милость Бога, Который хочет испытать – любя вас – вас и вашу превосходную мать. Ах, мой друг, религия, и только одна религия, может нас, уже не говорю утешить, но избавить от отчаяния; одна религия может объяснить нам то, чего без ее помощи не может понять человек: для чего, зачем существа добрые, возвышенные, умеющие находить счастие в жизни, никому не только не вредящие, но необходимые для счастия других – призываются к Богу, а остаются жить злые, бесполезные, вредные, или такие, которые в тягость себе и другим. Первая смерть, которую я видела и которую никогда не забуду – смерть моей милой невестки, произвела на меня такое впечатление. Точно так же как вы спрашиваете судьбу, для чего было умирать вашему прекрасному брату, точно так же спрашивала я, для чего было умирать этому ангелу Лизе, которая не только не сделала какого нибудь зла человеку, но никогда кроме добрых мыслей не имела в своей душе. И что ж, мой друг, вот прошло с тех пор пять лет, и я, с своим ничтожным умом, уже начинаю ясно понимать, для чего ей нужно было умереть, и каким образом эта смерть была только выражением бесконечной благости Творца, все действия Которого, хотя мы их большею частью не понимаем, суть только проявления Его бесконечной любви к Своему творению. Может быть, я часто думаю, она была слишком ангельски невинна для того, чтобы иметь силу перенести все обязанности матери. Она была безупречна, как молодая жена; может быть, она не могла бы быть такою матерью. Теперь, мало того, что она оставила нам, и в особенности князю Андрею, самое чистое сожаление и воспоминание, она там вероятно получит то место, которого я не смею надеяться для себя. Но, не говоря уже о ней одной, эта ранняя и страшная смерть имела самое благотворное влияние, несмотря на всю печаль, на меня и на брата. Тогда, в минуту потери, эти мысли не могли притти мне; тогда я с ужасом отогнала бы их, но теперь это так ясно и несомненно. Пишу всё это вам, мой друг, только для того, чтобы убедить вас в евангельской истине, сделавшейся для меня жизненным правилом: ни один волос с головы не упадет без Его воли. А воля Его руководствуется только одною беспредельною любовью к нам, и потому всё, что ни случается с нами, всё для нашего блага. Вы спрашиваете, проведем ли мы следующую зиму в Москве? Несмотря на всё желание вас видеть, не думаю и не желаю этого. И вы удивитесь, что причиною тому Буонапарте. И вот почему: здоровье отца моего заметно слабеет: он не может переносить противоречий и делается раздражителен. Раздражительность эта, как вы знаете, обращена преимущественно на политические дела. Он не может перенести мысли о том, что Буонапарте ведет дело как с равными, со всеми государями Европы и в особенности с нашим, внуком Великой Екатерины! Как вы знаете, я совершенно равнодушна к политическим делам, но из слов моего отца и разговоров его с Михаилом Ивановичем, я знаю всё, что делается в мире, и в особенности все почести, воздаваемые Буонапарте, которого, как кажется, еще только в Лысых Горах на всем земном шаре не признают ни великим человеком, ни еще менее французским императором. И мой отец не может переносить этого. Мне кажется, что мой отец, преимущественно вследствие своего взгляда на политические дела и предвидя столкновения, которые у него будут, вследствие его манеры, не стесняясь ни с кем, высказывать свои мнения, неохотно говорит о поездке в Москву. Всё, что он выиграет от лечения, он потеряет вследствие споров о Буонапарте, которые неминуемы. Во всяком случае это решится очень скоро. Семейная жизнь наша идет по старому, за исключением присутствия брата Андрея. Он, как я уже писала вам, очень изменился последнее время. После его горя, он теперь только, в нынешнем году, совершенно нравственно ожил. Он стал таким, каким я его знала ребенком: добрым, нежным, с тем золотым сердцем, которому я не знаю равного. Он понял, как мне кажется, что жизнь для него не кончена. Но вместе с этой нравственной переменой, он физически очень ослабел. Он стал худее чем прежде, нервнее. Я боюсь за него и рада, что он предпринял эту поездку за границу, которую доктора уже давно предписывали ему. Я надеюсь, что это поправит его. Вы мне пишете, что в Петербурге о нем говорят, как об одном из самых деятельных, образованных и умных молодых людей. Простите за самолюбие родства – я никогда в этом не сомневалась. Нельзя счесть добро, которое он здесь сделал всем, начиная с своих мужиков и до дворян. Приехав в Петербург, он взял только то, что ему следовало. Удивляюсь, каким образом вообще доходят слухи из Петербурга в Москву и особенно такие неверные, как тот, о котором вы мне пишете, – слух о мнимой женитьбе брата на маленькой Ростовой. Я не думаю, чтобы Андрей когда нибудь женился на ком бы то ни было и в особенности на ней. И вот почему: во первых я знаю, что хотя он и редко говорит о покойной жене, но печаль этой потери слишком глубоко вкоренилась в его сердце, чтобы когда нибудь он решился дать ей преемницу и мачеху нашему маленькому ангелу. Во вторых потому, что, сколько я знаю, эта девушка не из того разряда женщин, которые могут нравиться князю Андрею. Не думаю, чтобы князь Андрей выбрал ее своею женою, и откровенно скажу: я не желаю этого. Но я заболталась, кончаю свой второй листок. Прощайте, мой милый друг; да сохранит вас Бог под Своим святым и могучим покровом. Моя милая подруга, mademoiselle Bourienne, целует вас.

Последнее обновление: 1.11.2015

Функция gl.texImage2D

Данный метод загружает текстуру в GPU (графический процессор на видеокарте). Он имеет следующий синтаксис: texImage2D(target, level, internalformat, format, type, elem)

    target : указывает целевой объект для загрузки текстуры

    level : уровень множественного отображения текстуры

    internalformat и format : формат и внутренний формат. В WebGL должны иметь одно и то же значение. Так, формат gl.RGBA , к примеру, показывает, что для каждого текселя на текстуре должны быть установлены цветовые каналы для красного, зеленого и синего цветов, а также альфа-канал.

    type : тип данных, которых сохраняет все данные текселей текстуры. Например, gl.UNSIGNED_BYTE указывает, что для каждого цветового канала в gl.RGBA для сохранения данных выделяется один байт.

    elem : указывает на элемент, который содержит источник текстурирования. Это может быть элемент img или Image. Это также может быть элемент HTML5 video или canvas.

Все возможные сочетания форматов и типов:

gl.UNSIGNED_BYTE

gl.UNSIGNED_BYTE

gl.UNSIGNED_SHORT_4_4_4_4

gl.UNSIGNED_SHORT_5_5_5_1

gl.UNSIGNED_SHORT_5_6_5

gl.LUMINANCE_ALPHA

gl.UNSIGNED_BYTE

gl.UNSIGNED_BYTE

gl.UNSIGNED_BYTE

Я думаю, формат gl.RGBA понятен: каждый тексель текстуры имеет канал красного, зеленого и синего цветов, а также альфа-канал. Формат gl.RGB - то же самое, только без альфа-канала.

Формат gl.LUMINANCE_ALPHA имеет канал яркости и альфа-канал. И формат gl.LUMINANCE имеет только канал яркости, а формат gl.ALPHA - только альфа-канал.

Например, настройка gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE_ALPHA, gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE, image); даст следующий эффект:

Касательно типов тоже все просто. Тип gl.UNSIGNED_BYTE предоставляет по одному байту на каждый канал.

Тип gl.UNSIGNED_SHORT_4_4_4_4 предоставляет для каждого канала в формате RGBA по четыре байта.

Тип gl.UNSIGNED_SHORT_5_5_5_1 предоставляет для каждого каналов красного, зеленого и синего цветов в формате RGBA по пять байт, а для альфа-канала - один байт.

И тип gl.UNSIGNED_SHORT_5_6_5 предоставляет для каналов красного и синего цветов по пять байт и для зеленого цвета - шесть байт в формате RGB.

Определение параметров текстуры

Метод gl.texParameteri() позволяет определить параметры текстуры. Он имеет следующий формальный синтаксис: texParameteri(target, pname, param) . Сочетания параметров бывают разными и могут влиять на используемые значения.

    target : в зависимости от направления текстурирования может принимать значения gl.TEXTURE_2D , либо gl.TEXTURE_CUBE_MAP

    pname : указывает на фильтр, который мы хотим установить. Может принимать следующие значения: gl.TEXTURE_MAG_FILTER , gl.TEXTURE_MIN_FILTER , gl.TEXTURE_WRAP_S и gl.TEXTURE_WRAP_T

    param : предоставляет значение для фильтра pname. То есть в выражении gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); фильтру текстуры gl.TEXTURE_MAG_FILTER устанавливается значение gl.NEAREST .

    Значения, передаваемые параметром param, разнообразны и позволяют создавать определенные эффекты, которые далее мы подробно разберем.

Зачем вообще нужна настройка этих параметров? В реальности текстуры имею определенные размеры, например, 128х128. Однако поверхность объекта, на которую накладывается текстура, может иметь как большие, так и меньшие размеры. Использование фильтра gl.TEXTURE_MAG_FILTER фактически помогает определить рендеринг текстуры, если она меньше размера объекта, то ее надо увеличить.

И фильтр gl.TEXTURE_MIN_FILTER , наоборот, указывает, каким образом надо проводить рендеринг, если размеры поверхности объекта меньше размеров текстуры.

gl.NEAREST

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

gl.LINEAR

Данный фильтр возвращает средневзвешенное значение соседних четырех пикселей, центры которых находятся ближе всего к точке, с которой семплер берет цветовые значения. Это обеспечивает цветовую плавность, плавное смешивание цветов. В то же время, поскольку здесь для определения цвета нужны значения четырех пикселей, то и работать данный фильтр будет медленне, чем gl.NEAREST, но при этом более качественней.

Это значение может быть установлено как для фильтра gl.TEXTURE_MIN_FILTER, так и для фильтра gl.TEXTURE_MAG_FILTER.

Сравнение двух фильтров

Mip-текстурирование

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

Mip-текстурирование в WebGL использует ряд фильтров. Подобные фильтры могут использоваться только в качестве значения для фильтра gl.TEXTURE_MIN_FILTER:

    gl.NEAREST_MIPMAP_NEAREST : фильтр использует одну копию текстуры, которая наиболее подходит под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму NEAREST. Самый быстрый способ текстурирования, но при этом менее качественный

    gl.LINEAR_MIPMAP_NEAREST : фильтр использует одну копию текстуры, которая наиболее подходит под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму LINEAR

    gl.NEAREST_MIPMAP_LINEAR : фильтр использует две копии текстуры, которые наиболее подходят под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму NEAREST. Выборка цвета пикселя идет параллельно сразу из двух копий, а финальное значение цвета представляет средневзвешенное значение двух выборок

    gl.LINEAR_MIPMAP_LINEAR : фильтр использует две копии текстуры, которые наиболее подходят под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму LINEAR. Выборка цвета пикселя идет параллельно сразу из двух копий, а финальное значение цвета представляет средневзвешенное значение двух выборок. Наиболее медленный способ, но при этом дающий наибольшее качество

Само использование этих значений для фильтров еще предполагает, что у нас будет использоваться mip-текстурирование. Перед этим нам надо сгенерировать мипмапы, то есть копии текстуры, с помощью метода gl.generateMipmap(gl.TEXTURE_2D); . Этот метод должен вызываться после метода gl.texImage2D(). То есть, возьмем из ранее использованный примеров текстурирования функцию handleTextureLoaded и изменим ее так, чтобы использовались мипмапы:

Function handleTextureLoaded(image, texture) { gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); gl.generateMipmap(gl.TEXTURE_2D); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); }

Это даст нам следующий результат:

Надо отметить, что мип-текстурирование имеет некоторые ограничения: используемые изображения должны иметь размеры, которые равны степени двойки. Например, 16px, 32px, 64px, 128px и т.д. При этом необязательно, чтобы высота и ширина были равные, главное, чтобы их значения были равны степени двойки.

Texture wrapping

Еще один способ текстурирования называется texture wrapping . Этот термин можно перевести как обертывание текстурой. То есть данный способ определяет поведение семплера при отборе цветов пикселей с текстуры, если заданные координаты текстуры находятся вне диапазона .

В данном случае нам потребуется установить значения для фильтров gl.TEXTURE_WRAP_S и gl.TEXTURE_WRAP_T , которые отвечают за рендеринг текстуры вдоль осей s и t.

Например, у нас определены следующие координаты текстуры в буфере координат текстуры:

// Координаты текстуры var textureCoords = [ 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0 ];

А функция handleTextureLoaded выглядела бы следующим образом:

Function handleTextureLoaded(image, texture) { gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); gl.generateMipmap(gl.TEXTURE_2D); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); }

То мы можем получить следующий результат:

Для параметров мы можем использовать следующие значения:

    gl.CLAMP_TO_EDGE : все координаты текстуры, которые больше 1 и меньше 0, сжимаются до диапазона

    gl.REPEAT : происходит повторение текстуры после выхода вне диапазона

    gl.MIRRORED_REPEAT : повторение текстуры с зеркальным отображением

Можно комбинировать данные значения, как в вышеприведенном примере, где одновременно используются gl.REPEAT и gl.CLAMP_TO_EDGE.

Назначение

Изображение лучше всего выглядит, когда детализация текстуры близка к разрешению экрана. Если разрешение экрана высокое (текстура слишком маленькая/объект очень близко), получается размытое изображение. Если же разрешение текстуры слишком высокое (текстура слишком велика/объект очень далеко), получаем случайные пиксели - а значит, потерю мелких деталей, мерцание и большой процент промахов в кэш . Получается, что лучше иметь несколько текстур разной детализации и накладывать на объект ту, которая наиболее подходит в данной ситуации.

Принцип действия

Создаётся так называемая MIP-пирамида - последовательность текстур с разрешением от максимального до 1×1. Например: 1×1, 2×2, 4×4, 8×8, 16×16, 32×32, 64×64, 128×128, 256×256, 512×512 и 1024×1024. Каждая из этих текстур называется MIP-уровнем (англ. MIP level ) или уровнем детализации (англ. level of detail ).

На всех этих текстурах находится одно и то же изображение. Таким образом, MIP-текстурирование увеличивает расход видеопамяти на треть: .

При наложении текстур вычисляется расстояние до объекта, соответственно находится номер текстуры как , где resolution - разрешение виртуальной камеры (количество пикселей, которое будет в объекте размером в 1 ед., расположенном в 1 ед. от камеры), texelsize - размер текселя в единицах трёхмерного мира, dist - расстояние до объекта в тех же единицах, mip bias - число, позволяющее выбирать более или менее детальную текстуру, чем даёт формула. Эта цифра округляется до целого, и текстура с соответствующим номером (нулевая - самая детальная, первая - вдвое меньшая и т. д.) накладывается на объект.

Недостатки, способы решения

MIP-текстурирование не решает проблему текстур, находящихся под острым углом к зрителю (например, дорога в автосимуляторе). У таких текстур разрешение по одной оси сильно отличается от разрешения по другой - и, например, по оси X изображение явно размыто, в то время как по оси Y видны мерцания, свойственные завышенному разрешению текстуры. Есть сразу несколько способов решения этого (начиная с наименее качественного):

  1. Установить в видеодрайвере наиболее комфортное значение mip bias - числа́, которое отвечает за выбор номера текстуры в пирамиде. Если оно отрицательное, видеоплата берёт более детальные текстуры, если положительное - менее детальные.
  2. Многие игры сами устанавливают подходящий mip bias для разных типов объектов. Например, в Live for Speed mip bias устанавливается пользователем отдельно для автомобилей, препятствий и дороги.
  3. Воспользоваться анизотропной фильтрацией - методом текстурирования, который направлен именно на решение этой проблемы.

Наконец, видна чёткая граница между MIP-уровнями. Это решается трилинейной фильтрацией .

Ссылки

  • Михаил Хабров Создание детальных текстур c помощью mip-map уровней в Direct3D8 . GameDev.ru (29 мая 2002 года). Архивировано из первоисточника 19 марта 2012. Проверено 12 июля 2009.

Wikimedia Foundation . 2010 .

Смотреть что такое "MIP-текстурирование" в других словарях:

    Главная текстура и её уменьшенные копии MIP текстурирование (англ. MIP mapping) метод текстурирования, использующий несколько копий одной текстуры с разной детализацией. Название происходит от лат. multum in parvo «много в одном». Содержание 1… … Википедия

    Трилинейная фильтрация усовершенствованный вариант билинейной фильтрации. MIP текстурирование, повышая чёткость изображения и процент попаданий в кэш на дальних расстояниях, имеет серьёзный недостаток: ясно видны границы раздела между MIP… … Википедия

Как видим, билинейная фильтрация выглядит несколько лучше, нежели Point Sampling. И всё же она очень далека от идеала.

Tri-Linear filtering

Tri-Linear filtering – трилинейная фильтрация, представляет собой симбиоз билинейной фильтрации и mip-текстурирования. Прежде чем говорить об алгоритме работы трилинейной фильтрации, давайте выясним, что такое МIP-текстурирование. MIP-текстурирование, или mip-mapping, – это метод уменьшения объёма вычислений, необходимых для точного наложения текстурного изображения на полигон. По сути, мипмеппинг выполняет те же задачи, что и Point Sampling, но делает это на порядок лучше. MIP-текстурирование призвано избавить нас от ухудшений изображений, когда несколько текселей накладываются на один пиксель.

Посмотрим на проблему глобальней и попробуем найти решение всему этому. Для того чтобы правильно вывести пиксель на экран, необходимо скомбинировать значения всех текселей, которые и будут накладываться на этот пиксель. Но пропускная способность памяти не бесконечна, а это огромнейший обьём работы, который неблагоприятно отразится на быстродействии вашей видеокарты. Mip-mapping способствует снижению объёмов этой работы. Метод MIP-текстурирования основан на генерации и хранении множества версий исходного текстурного изображения. Эти версии имеют большое количество разрешений, каждое из которых всё меньше и меньше исходного. Во время текстурирования пикселя вам достаточно выбрать версию текстурного изображения. В вашем распоряжении есть 4 близлежащих текселея из текстурного изображения, больших по размеру, чем пиксель, и столько же текселей, меньших по размеру, чем пиксель. По сути, mip-уровни представляют собой заранее рассчитанные, более маленькие версии исходной текстуры, из-за чего обеспечивается лучшая аппроксимация.

Итак, мы выяснили, что такое mip-mapping, теперь вернёмся к нашей трилинейной фильтрации. Как мы уже говорили, Tri-Linear filtering представляет собой симбиоз билинейной фильтрации и mip-текстурирования. По сути, билинейная фильтрация производится на двух mip-уровнях. А в итоге мы имеем 2 текселя, по одному для каждого mip-уровня. Цвет пикселя определяется при помощи интерполяции по цветам двух mip-текстур.

В итоге имеем несколько лучшее качество фильтрации, нежели у билинейной. Стоит отметить, что качество улучшается незначительно, а требования к ширине полосы пропускания памяти в сравнении с той же Bi-Linear Filtering удваиваются.

Anisotropic filtering

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

Вполне очевидно – для того чтобы добиться лучшего качества, необходимо использовать все пиксели светового пятна с усреднённым значением. Существуют техники фильтрации, которые применяют от 16 до 32 текселей для определения цвета пикселя. Мы также должны учитывать тот факт, что форма светового пятна изменяется вместе с изменением положения полигона относительно точки наблюдения. Собственно говоря, этим и предлагает пользоваться анизотропная фильтрация.

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

Помимо всего этого, Anisotropic filtering предлагает задействовать разнообразные фильтры для аппроксимации формы светового пятна. Эти фильтры имеют форму эллипса для нескольких возможных углов положения полигона.

В видеорешениях, использующих тайловую (тайл, говоря простым языком, – участок изображения опредёленного размера, как правило, 32х32 пикселя) архитектуру, благодаря применению тайлов, существенно экономятся ресурсы полосы пропускания памяти, что позволяет использовать анизотропную фильтрацию без значимых потерь быстродействия. При помощи анизотропной фильтрации можно получить лучшее качество изображения. Оно достигается за счёт более точного представления текстур и улучшенной глубины детализации.

Уровень анизотропной фильтрации определяется числом текселей, которые обрабатываются при вычислении конечного пикселя. Современные графические решения позволяют выставить уровень фильтрации в драйвере. Самыми распространёнными уровнями фильтрации являются 2x (16 текселей), 4x (32 текселя), 8x (64 текселя) и 16x (128 текселей). Очевидно, что при повышении уровня анизотропной фильтрации нагрузка на полосу пропускания памяти также увеличивается, а это неминуемо сказывается на производительности.

Оптимизации анизотропной и трилинейной фильтраций сегодня

Компании-разработчики графических чипов ATI и NVIDIA всё время стараются выжать дополнительную производительность из своих продуктов. Что, в общем-то, очевидно и оправдано – конкуренцию между двумя гигантами-производителями графических процессоров никто не отменял. Для достижения своих целей вендоры применяют различные оптимизации, которые позволяют увеличить производительность графических решений. Однако зачастую оптимизации повышают производительность, но снижают качество картинки. Увы, но поговорка «сделать быстрей – не значит сделать лучше» очень часто актуальна для ситуации с различными оптимизациями ATI и NVIDIA.

Разработчики пытаются играть на всё тех же особенностях зрения человека и стараются повысить производительность за счёт слабозаметного ухудшения качества изображения. Возьмём, к примеру, брилинейную фильтрацию. Нет-нет, мы не оговорились, именно брилинейная фильтрация. Так сказать, новый вид, который появился благодаря упорным стараниям вендоров. Брилинейная фильтрация представляет собой смешанный режим фильтрации между билинейной и трилинейной – область, в которой граничат соседние mip-уровни, и которая, собственно говоря, подвергается трилинейной фильтрации, была уменьшена. Вследствие этого удалось поднять производительность, что вполне ожидаемо, ведь мы фильтруем гораздо меньше. При этом качество изображения становится хуже, однако ухудшение качества в данном случае явно оправдано, если учесть значительный выигрыш в производительности. Это отчётливо видно, если сравнивать изображения, полученные с помощью полной трилинейной фильтрации. Брилинейную фильтрацию впервые применила NVIDIA на своих видеокартах GeForce FX 5xxx Новые видеокарты GeForce 6xxx также используют брилинейную фильтрацию, однако компания NVIDIA после критики и различных дискуссий в многочисленных конференциях добавила возможность отключения оптимизации.

В недалёком прошлом продукты компании ATI славились более высоким качеством картинки, нежели таковые от NVIDIA. Однако с выходом графического процессора Radeon 9600 всё изменилось – последний, как и более новое решение Radeon X800, также использует брилинейную фильтрацию. Однако, в отличие от NVIDIA, ATI не соизволила не только объяснить процедуру фильтрации, но и не признала сам факт использования оптимизаций.

Компания ATI пошла на хитрость: драйверы переключаются на полную трилинейную фильтрацию при использовании цветных mip-текстур. Именно последние применяются в стандартных тестах качества, которые используют обозреватели и тестировщики.

Однако находчивые ребята с сайта Computerbase обнаружили, что в компьютерной игре «Call Of Duty» X800 даёт меньшую частоту кадров при использовании цветных mip-текстур. После чего обозреватели Computerbase провели сравнение качества изображения. Как оказалось, при применении обычных текстур Radeon X800 использует брилинейную фильтрацию. При употреблении цветных текстур в «Call Of Duty» (1600х1200) общий показатель FPS Radeon Х800 падает на 11-13 fps.

Самое интересное, что ATI заявляет об использовании полноценной трилинейной фильтрации и рекомендует тестировщикам отключать оптимизации у конкурентов для обеспечения честного сравнения.

В интервью популярному сайту Toms Hardware Guide компания ATI всячески уходила от конкретного ответа, утверждая, что X800 использует полноценную трилинейную фильтрацию. На этом оптимизации от компании ATI не заканчиваются. Так, продукты канадской фирмы ATI используют ещё один вид оптимизации, который называется «stage optimization» – оптимизацией ступени. Метод оптимизации основан на применении «трилинейной» (брилинейной) фильтрации только к первой ступени текстуры (0). Остальные ступени 1-7 фильтруются простым билинейным методом.

Стоит отметить, что во многих играх это не критично, поскольку верхние ступени текстур являются либо картами неровностей, либо картами освещения, для которых полноценная фильтрация не критична, поэтому ухудшения изображения вы попросту не заметите. Однако есть и исключения. Популярная компьютерная игра «Unreal Tournament» использует карты деталей с высоким разрешением на ступенях 1-7, поэтому потери в качестве неизбежны.

Также стоит оговориться, что эта оптимизация функционирует только при насильственном включении анизотропной фильтрации в драйверах вашей видеокарты. Если вы оставляете выбор приложению (by application), то обеспечивается полноценная «трилинейная» (брилинейная) фильтрация ко всем ступеням текстуры.

Компания NVIDIA также стала использовать эту оптимизацию, которая появилась в драйверах версии 51.xx для карт GeForce 5xxx.

Адаптивная анизотропная фильтрация – ещё одна вариация на тему оптимизаций. Её уже давно используют продукты компании ATI. NVIDIA также не отстаёт – в GeForce 6800 эта оптимизация частично реализована.

Алгоритм адаптивной анизотропной фильтрации заключается в том, что поверхности 3D-изображения получают различный уровень анизотропной фильтрации в точке наблюдения. Такой подход позволяет существенно экономить вычислительные ресурсы и тем самым значительно повышать общий fps.

Использование такого метода фильтрации оправданно. Представьте себе сцену из какой-нибудь компьютерной игры: скажем, ваш герой стоит лицом к стене. Фильтровать стену с уровнем анизотропной фильтрации 16х не имеет смысла, то есть картинка будет такой же, как и с 2х. Идея адаптивной анизотропной фильтрации очевидна: «сэкономь вычислительную мощность там, где это можно, дабы последняя не расходовалась впустую».

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

Напоследок хотелось бы отметить, что вендорам было бы неплохо реализовать возможность отключения адаптивной анизотропной фильтрации.



Рекомендуем почитать

Наверх