Текстуры и RGB-каналы в Unreal Engine 4

Это устаревшая статья, которая была написана без какой-либо структуры. На данный момент я выложил цикл туториалов на тему текстурирования, где покрываются максимально все аспекты текстурирования. Прочитать можно здесь.

Статья сохранена в качестве истории.

RGB и Unreal Engine


Общие понятия RGB-каналов


RGB (часто RGBA) — это аббревиатура от Red-Green-Blue (Alpha). Что означает 3 канала цветов, смешивание которых приводит к передаче нужного оттенка цвета (Если используется Альфа, то и указание степени прозрачности того или иного элемента).

Каждый канал состоит из значений от 0 до 255. Эти значения являются уровнем канала. Чем выше уровень, тем сильнее в канале цвет. Каждый пиксель текстуры (любого изображения и вашего монитора) отображается в формате RGB — то есть, у каждого пикселя одновременно работают 3 канала цветов — каждый со своим уровнем.

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

Ниже на картинке активен только красный канал, остальные имеют значения, равные нулю:

image

Стоит отметить, что в движке Unreal Engine 4 значения цветов имеют не 0-255, а от 0 до 1. На самом деле, это сделано для удобства программирования, а по факту уровни каналов все так же имеют значения от 0 до 255, только представлены в рамках 0-1, где 0 = 0, а 1 = 255. При этом, если sRGB выключен, то используется обычное линейное сопоставление, где значение 0.5 будет равно 128.

Unreal Engine 4 способен работать со всеми каналами одновременно (передача полноценной цветовой гаммы) и с каждым каналом отдельно.

Ниже на картинке показано, как нода цвета выглядит в движке:

image

Эта нода не содержит в себе цвет. Это набор из 4-х значений — RGBA-каналов, которые записываются, как числа с плавающей точкой от 0 до 1 каждый. И можно установить в каждый канал свое значение и выдавать его. Цвет — лишь общая сумма этих значений в одном пикселе.

Первый пин из ноды — это сумма трех каналов — RGB.

Второй, третий и четвертый пины — это выходы каждого из каналов соответственно.

Пятый пин — это четвертый канал или Альфа-канал. По задумке и общему представлению, этот канал используется для контроля прозрачности — что должно быть прозрачным, что не должно быть прозрачным, а что — полупрозрачным.

На самом деле, Альфа-канала (как канала прозрачности) не существует. Это все тот же набор цифр от 0 до 1, поэтому этот канал можно заменить свободно любым другим каналом, который предоставит нужные уровни прозрачности (уровни значений от 0 до 1 в нужных пикселях).
Однако. Стоит помнить о том, что Альфа-канал занимает объем места равный всем трем каналам RGB. А стоимость его обработки увеличивается в 2 раза по сравнению обработкой любого из каналов RGB в отдельности.

Офтоп. Вообще, эта нода является вектором — контейнером, содержащим в себе 4 значения.

Использование каналов в Unreal Engine 4


Обычно в Unreal Engine 4 используется текстура типа TARGA. Она позволяет работать с каждым каналом отдельно.

В PBR* существуют такие карты, как АО, Metallic, Roughness, Specullar и Emissive (Еще куча вариантов, но нам и этого достаточно). Все эти карты используют только значения от 0 до 1 (черно-белые карты). То есть, движку для расчета этих карт достаточно 1-го канала со значениями от 0 до 1.

Например, Metallic может быть либо 0, либо 1 (либо металл, либо не металл). Соотвественно, пиксель может иметь значение 1 (белый цвет в визуальном представлении) или 0 (черный цвет в визуальном представлении).

Для примера есть такая текстура. В RGB-канале (все три канала вместе) отображается след.картина:

image

Если посмотреть на каждый канал отдельно, то видно, как изменяются текстуры — один канал отвечает за Roughness, второй — за Specular, третий за AO, четвертый — за альфу.

image
image
image
image

На последней картинке так же отображается шкала цвета в Adobe Photoshop, в которой нельзя указать никакой другой цвет, кроме как градиент белого (от 0 до 255) при редактировании в каком-то одном канале (на картинке редактирование происходит на канале «Альфа»).

Соответственно, текстуру можно использовать теперь для подключения в материал Unreal Engine 4 сразу по трем (или 4) параметрам. Канал «альфа» не обязательно использовать для прозрачности — он так же может быть использован в качестве любой другой текстуры, где требуется указывать значения от 0 до 1 в рамках одного канала.

*PBR — PHYSICALLY BASED RENDERING. Физически корректный рендер (рендер, основанный на физике). Система отображения текстур согласно физическому поведению реального света.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 32

    +4
    Казалось бы… Причем тут UE?
    Всё это не имеет непосредственного отношения к UE. Это везде так.
      –4
      По текстурам — да, текстуры можно использовать везде такие, на то оно и канальное везде. Однако я описываю здесь то, как это применительно к UE. Если у Вас знаний уже достаточно к использованию каналов не только в качестве BaseColor-текстур, то многие начинающие найдут эту статью полезной. Мне бы она пригодилась года 2-3 назад.
      0
      Стоит отметить, что в движке Unreal Engine 4 значения цветов имеют не 0-255, а от 0 до 1. На самом деле, это сделано для удобства программирования, а по факту уровни каналов все так же имеют значения от 0 до 255, только представлены в рамках 0-1, где 0 = 0, а 1 = 255.

      А чему там равен цвет (0.5, 0.5, 0.5)? (128, 128, 128) или (188, 188, 188)?

        –3
        0.5 = 180, как ни странно.
          0
          Зависит от того, используете вы sRGB или нет.
          Если sRGB включен, то 188, если выключен то используется обычное линейное сопоставление и будет 128.
            0
            И все-таки, у меня значение 0.5 показывает 180, а не 188.
            В любом случае, спасибо. А минусы — это круто =)
              0
              image
              BC==188
              Если бы было 180, то HEX был бы B4.
                0
                Из 16-ти в 10-ную — да.
                Я напрямую в Photoshop вставлял значения, и он выдавал 180 вместо положенных 188.
                Кстати, какая зависимость работает при включенном sRGB? То есть, почему он на 0.01 показывает значение приближенное к 25, а 0.1 — к 44?
                  0
                  Не совсем понимаю — какое значение вставляли в фотошоп?
                  Про sRGB — на википедии есть формула для преобразования.
                    0
                    BC. Ну, да, спасибо за отссылку в википедию =)
                      0
                      ТО есть вы взяли значение 188, перенесли в его в сторонний инструмент(который работает другим способом), где оно преобразовалось в B4 и на этом основании говорите, что там не BC, а B4. :)
                      Ну это в фотошопе B4. Мыж про Unreal сейчас. В фотошопе вообще вроде Adobe RGB — другая цветовая схема.
                        –1
                        Я не заморачивался, были открыты оба окна, почему бы и не проверить значение там =))
              0
              Добавил в статью. Спасибо еще раз.
                0
                Отдельно стоит отметить, что sRGB надо использовать только для Diffuse и Albedo текстур. Остальные цвета/текстуры в PBR должна быть в линейном представлении.
              0
              Всем спасибо за урезку кармы до минуса — более не буду выкладывать статьи =) Очень обрадовался, что столько знающих оказалось о работе RGB в UE, и полезности в моей статьи никакой =)
                0
                Насколько я вижу — вас всего пара человек минусануло. Не сдавайтесь так легко. :)
                +1
                Стоит отметить, что в движке Unreal Engine 4 значения цветов имеют не 0-255, а от 0 до 1. На самом деле, это сделано для удобства программирования, а по факту уровни каналов все так же имеют значения от 0 до 255, только представлены в рамках 0-1, где 0 = 0, а 1 = 255. При этом, если sRGB выключен, то используется обычное линейное сопоставление, где значение 0.5 будет равно 128.

                HDR текстуры я так понимаю вы вообще не рассматриваете? У которых значения вообще в полном диапазоне float может быть? Ну и да 0-1 это вообще как бы не фишка только UE. GLSL и HLSL также используют для диапазона цветов 0-1.
                  0
                  Я правильно понимаю, что в HDR не только значения больше 1 могут быть, но и градаций между 0 и 1 — значительно больше? И так в т.ч. в Unity?
                    0
                    А зачем вам больше градаций между 0 и 1?
                    Фишка HDR — это именно широкий диапазон, а не большая точность. 8 бит на цвет — заглаза. Буквально. :)
                      0
                      Для пост-обработки ведь. Если я работаю в линейном пространстве — необходимо потом расширять темные участки. И вот у меня первые 16 градаций растянутся на все 128.

                      Так что я искренне надеюсь, что HDR не только расширяет, но и уточняет.
                        0
                        Если я работаю в линейном пространстве — необходимо потом расширять темные участки. И вот у меня первые 16 градаций растянутся на все 128.

                        Если вы в HDR работаете у вас этого не будет.
                        Всё, я понял о чем вы говорите. Очень темная сцена, в итоге используется только часть диапазона и потом он растягивается до полного, во время tone mapping.

                        да, не будет с этим проблем. там же float. у него либо маленькое точное значение, либо большое не точное.
                          0
                          Очень темная сцена, в итоге используется только часть диапазона и потом он растягивается до полного, во время tone mapping

                          Да!

                          да, не будет с этим проблем. там же float. у него либо маленькое точное значение, либо большое не точное.

                          Окей, просто в большинстве статтей указывается только на то, что hdr отвечает за значения больше 1, но нигде я не видел явного указания, что увеличивается количество градаций между 0 и 1.
                            +1
                            Решил проверить на практике, как в Unity работает HDR+Tonemapping (простите, что в теме про Анрил). Создал сцену, где есть очень легкий градиент с лесенкой, создаваемый светом:



                            Теперь tonemapping-ом добавляю контрасности. Без HDR изменения происходят именно по границе старого градиента, то есть все — эта форма навеки и переход может быть только более заметен


                            Вот результат с включенным HDR и теми же найстройками ToneMapping:


                            Видно, что HDR отвечает не только за значения больше 1, но и добавляет огромное количество между 0 и 1.
                              0
                              Всё вполне ожидаемо.
                                0
                                Согласен. Ожидаемо, корректно и так, как должно быть. Я рад, что теперь знаю это наверняка))
                        0
                        8 бит на цвет — заглаза

                        И кстати, к сожалению, 8 бит на цвет — это таки маловато. Иногда на объектах без текстур становятся заметны лесенки. Именно потому в фотошопе используется или дизеринг на градиенте или 16 бит на цвет. Вот тогда точно достаточно)
                          0
                          Чудеса какие-то. А можете изображение-пример привести? Что-то пне модсказывает, что у лесенки там совсем не 1 будет разница.
                            0
                            Может быть все таки речь о редактировании? То есть как в примере с темной сценой — у нас некая текстура, мы её высветляем/затемняем — получаем на выходе сломанную точность. Ровно тоже самое, что и при масштабировании изображения.
                            Это не проблема 8 битной точности. Это проблема масштабирования. То есть попытка вытащить данные оттуда, где их нет.
                              0


                              Если присмотрется (иногда, правда, зависит от монитора), то можно увидеть 15 «ступенек» идущих слева направо. Это довольно известный художникам факт, и у Лебедева было.

                              На самом деле даже на скриншоте с Юнити (без постобработки) видно:


                              Именно по этой лесенке потом изменяется яркость. То есть 256 градаций, обычно, достаточно (особенно если есть текстура — их вообще не заметить), но иногда вылезают такие неприятные лесенки, потому что в целом переход с (128) на (129) глазом заметить можно.
                    0
                    Главное не забыть потом и не сохранить текстуру в jpeg или dxtN.
                      0

                      Статья была бы многим интереснее, если б вы описали как рассчитывается канал alpha. Например у меня пиксель имеет значение 255,255,255,0.5 (т.е. полностью белый с 50% прозрачности) за этим пикселем красный фон (255,0,0) по какой формуле получается цвет, который выводиться на монитор?

                        0
                        Не знаю, как в Анриле, но в других движках использовать альфа канал, для передачи карт свойства материала (бамп, спекуляр, ао, и т.п.) надо с осторожностью, потому-то в некоторых случаях во фрагментный шейдер передаются сразу альфа-преумноженые цвета (это делается для корректного альфа блендинга) и поэтому на выходе можно получить неожиданный результат. Ну и по поводу использования sRGB, мне кажется вместо этого лучше использовать гамма-коррекщию при пост-обработке.

                        Only users with full accounts can post comments. Log in, please.