Карта нормалей в касательном пространстве (Tangent Space) — один из самых популярных видов карт нормалей, применяемых в 3D. Проще всего получить такую карту нормалей для любого объекта в Blender можно наложив на него соответствующий маткап из встроенного в Blender набора маткапов. Так же при необходимости, такую карту нормалей можно получить и при помощи шейдерных нодов.
Добавим в сцену любой примитив, например — сферу (shift + a — Mesh — UV Sphere). Добавим на нее шейдер.
Сейчас в шейдере у нас всего два нода: Principled BSDF и Material Output. Для работы нод Principled BSDF нам не нужен, удалим его.
Добавим нод Texture Coordinate (shift + a — Input — Texture Coordinate). С него мы будем брать информацию о нормалях (выход Normal) на объекте по его поверхности.
Чтобы перейти в касательное пространство, добавим нод Vector Transform (shit + a — Utilities — Vector — Vector Transform). Переключим его в режим работы «Vector» для работы с векторами. Координатное пространство, которое у нас сейчас есть и в котором мы получаем вектора нормалей, это пространство объекта. Чтобы получить касательное пространство нам нужно перейти в пространство взгляда или камеры. Поэтому поставим исходное пространство в «Object», а финальное — в «Camera».
Подадим на вход Vector данные о нормалях объекта с выхода Normal нода Texture Coordinates.
Чтобы вектора правильно считались, нам нужно сдвинуть исходную точку отсчета из условного левого нижнего угла в центр взгляда. А так же, развернуть вектор направления взгляда на 180 градусов, чтобы «смотреть на объект».
Чтобы этого добиться добавим нод Vector Math (shift + a — Utilities — Vector — Vector Math) и переключим его в режим «Multiply Add». Во входном параметре Multiplier поставим значения (0.5, 0.5, -0.5), а в параметре Addend поставим значения (0.5, 0.5, 0.5).
С нода Vector Transform подадим данные на вход Vector.
На этом с преобразованиями — все. Мы получили карту касательных нормалей на объекте. Если сейчас подать выход Vector нода Multiply Add на вход Surface нода Material Output в 3D вьюпорте мы увидим нужную картинку.
Однако еще следует учесть так называемую «гамма-коррекцию». Для этого выходные значения вектора нам нужно возвести в степень 2.2.
После нода Multiply Add добавим еще один нод Vector Math (shift + a — Utilities — Vector — Vector Math) и переведем его в режим Power. На верхних вход Vector подадим наши данные по нормалям, получаемые с нода Multiply Add, а все элементы вектора в нижнем входе установим в значение 2.2.
Для сравнения мы можем на один объект наложить созданный нами шейдер, а на другой, такой же объект, наложить системный маткап и визуально сравнить их в режиме отображения рендера и маткапа.
Как мы видим, распределение совершенно идентично, следовательно наш шейдер работает правильно.

.blend file on Patreon