Текстуры и 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 в нужных пикселях).

Офтоп. Вообще, эта нода является вектором — контейнером, содержащим в себе 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. Физически корректный рендер (рендер, основанный на физике). Система отображения текстур согласно физическому поведению реального света.
Метки:
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 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, мне кажется вместо этого лучше использовать гамма-коррекщию при пост-обработке.

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