Данный метод загружает текстуру в 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.
Все возможные сочетания форматов и типов:
Что такое MipMap | MipMapping ?
Я думаю, формат 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 фактически помогает определить рендеринг текстуры, если она меньше размера объекта, то ее надо увеличить.
33 Ресурспака для Майнкрафт 1.19.3 (1.19+)
И фильтр gl.TEXTURE_MIN_FILTER, наоборот, указывает, каким образом надо проводить рендеринг, если размеры поверхности объекта меньше размеров текстуры.
gl.NEAREST
Данное значение позволяет семплеру взять из текстуры цвет того текселя, центр которого находится ближе всего к точке, с которой семплер берет цветовые значения.
Это значение может быть установлено как для фильтра gl.TEXTURE_MIN_FILTER, так и для фильтра gl.TEXTURE_MAG_FILTER.
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)
Это даст нам следующий результат:
Надо отметить, что мип-текстурирование имеет некоторые ограничения: используемые изображения должны иметь размеры, которые равны степени двойки. Например, 16px, 32px, 64px, 128px и т.д. При этом необязательно, чтобы высота и ширина были равные, главное, чтобы их значения были равны степени двойки.
Texture wrapping
Еще один способ текстурирования называется texture wrapping. Этот термин можно перевести как обертывание текстурой. То есть данный способ определяет поведение семплера при отборе цветов пикселей с текстуры, если заданные координаты текстуры находятся вне диапазона [0.0, 1.0].
В данном случае нам потребуется установить значения для фильтров 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.CLAMP_TO_EDGE : все координаты текстуры, которые больше 1 и меньше 0, сжимаются до диапазона [0, 1]
- gl.REPEAT : происходит повторение текстуры после выхода вне диапазона [0, 1]
- gl.MIRRORED_REPEAT : повторение текстуры с зеркальным отображением
Можно комбинировать данные значения, как в вышеприведенном примере, где одновременно используются gl.REPEAT и gl.CLAMP_TO_EDGE.
Источник: metanit.com
Проблема с мип
Привет! Я к вам опять с вопросом.
Внезапно откуда то взялась проблема с мип-текстурированием. Далекие от меня блоки ужимаются как то странно. (белые полоски и точки) И что я только уже не делал, и как настройки графики не менял, и как не добавлял разные типы рендеров и все такое — проблема не уходит. Покидайте идей, может у вас мысли какие есть?
Посмотрел старые скриншоты годичной давности, где были все эти же самые блоки. Там нет такой фигни(
Может это быть из-за того что «умная» видеокарта пытается «детализировать» изображение?
Если кстати вырубить детализацию, то полоски пропадают, но далекие блоки превращаются в месиво, что тоже не очень симпатично.
Делаю воксельные(и не только) 3D-модели для ваших Minecraft проектов. Портфолио можете увидеть полистав группу моего мода Soviet Lab — все модели сделаны мной.
Источник: forum.mcmodding.ru
Введение в MIP-карты
Мип или уровень мип — это версия текстуры с определенным разрешением. Мипы существуют в наборах, называемых мип-картами. MIP-карты содержат постепенно уменьшающиеся версии одной текстуры с более низким разрешением.
Например, мип-карта может содержать 4 версии текстуры: от исходной текстуры (мип 0) до мип 1, мип 2 и мип 3:
Mipmaps обычно используются для визуализации объектов в трехмерных сценах Сцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь , где текстурированные объекты могут различаться по расстоянию с камеры Компонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь . Более высокий уровень MIP используется для объектов, находящихся ближе к камере, а более низкий уровень MIP используется для более удаленных объектов.
Mipmaps может ускорить операции рендеринга и уменьшить артефакты рендеринга в ситуациях, когда графический процессор визуализирует текстуру с меньшим разрешением, чем ее полное разрешение. MIP-файл фактически представляет собой кэшированную версию исходной текстуры с уменьшенной дискретизацией. Вместо того, чтобы выполнять множество операций сэмплирования исходной текстуры с полным разрешением, графический процессор может выполнять меньшее количество операций с уже уменьшенной версией.
Иногда MIP-карты бесполезны. Мипмапы увеличивают размер текстуры на 33% как на диске, так и в памяти. Они также не дают никаких преимуществ, когда текстура визуализируется только в полном разрешении, например UI (пользовательский интерфейс). для взаимодействия с вашим приложением. В настоящее время Unity поддерживает три системы пользовательского интерфейса. Подробнее
Посмотрите в Словарь текстуру, которая не масштабируется. Вы можете создать мип-карту для текстуры вручную или поручить Unity сгенерировать мип-карту для вас. Чтобы автоматически сгенерировать мип-карту, убедитесь, что разрешение исходной текстуры равно степени двойки, как показано в примере изображения мип-карты.
Вы можете включить или отключить MIP-карты для ресурса текстуры в Инспекторе настроек импорта текстур.
Как GPU сэмплирует мип-уровни
Когда графический процессор сэмплирует текстуру, он определяет, какой уровень MIP использовать на основе координат текстуры (UV) для текущего пикселя Наименьшая единица в компьютерном изображении. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
См. в Словарь , а также два внутренних значения, вычисляемых графическим процессором: DDX и DDY. . DDX и DDY предоставляют информацию об UV-развертке пикселей рядом с текущим пикселем и над ним, включая расстояния и углы.
Графический процессор использует эти значения, чтобы определить, какая часть деталей текстуры видна камере. Большее расстояние и более экстремальный угол между текущим пикселем и его соседями означает, что графический процессор должен выбрать более низкое разрешение MIP; более короткое расстояние и менее экстремальный угол означают, что графический процессор должен выбрать мип-файл с более высоким разрешением.
ГП также может смешивать информацию о текстуре из двух мипов вместе при использовании трилинейной фильтрации. Смешивание мипов во время сэмплирования может сделать переход от одного мип-сигнала к другому менее заметным. Чтобы смешать мипы, графический процессор берет определенный процент информации о текстуре из одного мипа, а остальную часть — из другого мипа.
Мип-смещение
Настройка, называемая смещением мип, может выполнять две функции во время семплирования, в зависимости от настроек вашего сэмплера:
- Смещение MIP может изменить порог для GPU, выбирая более низкое или более высокое MIP для образца. Графический процессор выбирает определенный мип при использовании точечной фильтрации в вашем сэмплере. Например, GPU может решить, что текстура с набором UV-разверток должна использовать образец из Mip 3. При смещении mip, равном –2, вместо этого GPU будет использовать Mip 1 с более высоким разрешением для образца.
- Смещение мип-сигналов может указать графическому процессору, что один мип-файл предпочтительнее другого на определенный процент при смешивании сэмплов из разных мип-файлов. Графический процессор смешивает мипы при использовании линейной или трилинейной фильтрации в вашем сэмплере. Например, вычисления графического процессора могут вернуть значение 0,5. Значение 0,5 говорит графическому процессору брать 50% необходимой ему текстурной информации из одного мип-объекта, а оставшиеся 50% — из следующего мип-файла в мип-карте. Если добавить смещение MIP 0,2, значение 0,5 изменится на 0,7, а графический процессор получит 70 % информации о текстуре из первого MIP и только 30 % из второго.
Графический процессор имеет глобальное смещение MIP, которое по умолчанию применяется к выбору MIP. Текстуры могут иметь собственное мип-смещение, которое Unity добавляет или вычитает из глобального мип-смещения. Вы также можете указать собственное смещение MIP для отдельной операции выборки текстуры в ваших шейдерах программе, работающей на графическом процессоре. Подробнее
См. в Словарь .
Чтобы установить смещение MIP для отдельной текстуры, см. раздел Texture.mipMapBias. Чтобы установить смещение MIP для операции выборки текстуры в шейдере с ручным кодом, используйте функции HLSL, такие как tex2dbias. Чтобы установить смещение MIP для операции выборки текстуры в Shader Graph, см. Образец узла текстуры 2D-массива или Образец двухмерного узла текстуры.
Как Unity загружает мип-карты
Вы можете управлять тем, как Unity загружает MIP-карты во время выполнения, с помощью потоковой MIP-карты.
Источник: unityhub.ru