Полезное

Мы Вконтакте

Подробности работы UV в TextureSample и TexCoords

Добавлено Июл 30 2015

В этой статье рассказывается как же работают манипуляции текстур в TextureSample благодаря UV соеденению и TexCoord. Сам TexCoord часто используется в манипуляции текстурами или изображением в пост обработке. Очень важно понимать работу этого всего для того, что бы можно было самому создавать какие-либо эффекты и при этом не играя в угадывание того, какой эффект будет от того или иного действия.

Сам TextureSample с UV входом, который и определяет, какая текстура получится на выходе из этого TextureSample.

TextureSample

Вы наверняка видели блок TexCoord, со странной зелено-желто-красной текстурой. Он и помогает TextureSample блоку, вывести текстуру с соответствующей манипуляцией.

TexCoord блок

Эта карта 2х мерная, поэтому у неё есть следующие свойства (у каждого пикселя): положение пикселя по X, положение пикселя по Y, значение пикселя по каналу Red и по каналу Green. Положение определяет, где на выходе получается пиксель из подаваемого изображения, а значение определяет, какой именно пиксель отображается на этом положении.

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

Сама текстура, на примере которой будет разбирать предмет:

Текстура для примера

TexCoord — 2х мерная карта, состоящая только из красного канала и зеленого.

Каналы TexCoord карты

Красный канал определяет, какой пиксель по X будет отображаться на этом месте. Зеленый канал будет брать по Y. Размера у TexCoord как такового нету, он всегда от 0 до 1 от края до другого края. То есть если изображение у вас размером 1000 на 1000, то в последних координатах все равно будет значение 1 на каждый канал.

Давайте теперь определим, что же означает «какой пиксель будет отображаться на этом месте». Я хочу, что бы вы сейчас мысленно умножили карту на размер текстуры, то есть на 5 в нашем случае. Это значит, что теперь координатная карта у нас будет идти не в пределах 1, а в пределах 5-ти. То есть первый пиксель = 1, второй = 2 и так далее. Это поможет вам лучше понять, как именно распределяются пиксели в зависимости от карты. И я в дальнейшем тоже буду использовать подобные значение, хотя все равно учтите, что там на самом деле от 0 до 1.

Текстура и координатная карта

Возьмем самый первый пиксель. На координатной карте там 1 и 1 по красном и зеленому каналам. Это значит, что в том месте будет показываться именно первый пиксель от текстуры. В нижнем правом месте значения 5 и 5, то есть там будет показываться 5-й пиксель по X и 5й пиксель по Y. То есть шейдер берет текстуру, берет координатную карту, смотрит на этой карте, какой пиксель на это место положить и выдаст нам результат.

Теперь давайте немного изменим нашу координатную карту. Например развернем её к верх ногами.

Перевернутая TexCoord и логика работы шейдера

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

Теперь в позиции 0 0 на координатах находится значение 5 по красному и 5 желтому каналам. Это значит, что шейдер посмотрит, какой пиксель оригинальной тестуры находится на этом месте (X: 5, Y:5) и поместит его на позицию, где это значение находится на координатной карте, то есть в 0 0. А вот в последней позиции на координатной карте теперь наоборот значение 1:1, это значит, что он возьмет пиксель текстуры с 1:1 и положит его на это место.

Поскольку мы всю карту перевернули, то и пиксели теперь выстраиваются в другом порядке. Так, как говорит им координатная маска.

Перевернуть карту в движке можно использовав OneMinus блок. Если нужно развернуть только один канал, то вам нужно разбить карту на каналы. Например через Break2 развернуть один канал, через ту же функцию инвертировать координаты и собрать карты обратно в 2хмерную текстуру через Append. Далее уже присоединять результат в UV.

Если же вы сделаете всю карту со значениям 1:1, то и текстура в результате вся выйдет только с первым пикселем.

TexCoord тольо с одним значением

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

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

Разные приемы для TexCoord

  • Для смещения текстуры можно просто прибавить к карте или одному каналу определенное значение. Таким образом на координатной карте значения увеличатся и будут считывать соседние пиксели, вместо своих же.
  • Для растягивания/сужения текстуры можно воспользоваться умножением или делением. Тогда большие значения будут значительно больше/меньше, в то время как малые (вроде X:0.001 и Y:0.001 на координатной карте) изменятся совсем немного, что и даст нужный эффект.
  • Вы можете подать на UV не TexCoord, а просто обычное двумерное значение, из-за чего TextureSample в результате выдаст значение одного пикселя из текстуры.
    В данном случае это не просто координаты пикселя. Вам нужно задать значение от 0 до 1, то есть от начала до конца. Если у вас текстура, скажем, 128 на 128, то что бы получить 64й пиксель, вам все равно придется подать значение 0.5. Таким образом, если вы хотите вводить конкретную координату текстуры, формула будет следующая:
    C(1/R)
    C — координаты нужного пикселя.
    R — разрешение текстуры.
Добавил: Flakky Категория: Статьи


Комментарии

На данный момент не добавлено ни одного комментария.

Оставить комментарий

Вы должны войти, что бы оставлять комментарии.

cron
UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница