Я админю группу по Blender много лет, и бывает отвечаю на вопросы. Вопросы бывают разные, на какие‑то просто ответить одним словом, фразой или предложением, а на какие‑то просто так не ответишь — нужно писать целую статью.

Вот, к примеру, кто‑то жалуется, у него свечение не сохранилось в PNG. Или это не свечение а полу‑прозрачный шейдер или огонь - не важно. В Blender есть, а в PNG нет — баг какой‑то. И как тут ответить одним сообщением? Тут и про разные типы альфа‑канала надо рассказать, и почему они нужны и для чего используются, и какие‑то способы проблему обойти нужно дать, потому что теория теорией, а что делать‑то?

Типичный пример
Типичный пример

Два формата альфы

Начнём сначала. То что на свете существует два типа альфа‑канала люди в основном узнают либо когда сталкиваются с этой проблемой, либо никогда. Серьёзно. Ты можешь в совершенстве владеть 3д программой и даже запаковывать в альфа‑канал, например, roughness для HDRP, но при этом даже не догадываться, что альфа‑канал может быть в разных форматах. Обычно разные альфы не вызывают проблем — они автоматически конвертируются, правда не всегда удачно. Либо проблемы не замечаются.

Мне нравится как рассказывает об этих форматах Алан Меликджанян, если у вас хорошо с английским, рекомендую посмотреть. Начинает он так. Раньше, в аналоговые времена, когда фильмы снимали на плёнку, чтобы сделать коллаж из нескольких видео, нужно было один кадр проэкспонировать с маской, а второй кадр с этой же маской, но инвертированной. Полученные изображения нужно спроецировать на одну плёнку. Прошло время, люди перешли на цифру, но по сути ничего не поменялось, только вместо плёнки теперь нули и единицы, а вместо света, используемого при экспонировании — математика. Так в цифровом мире первый этап заменили умножением (MULTIPLY), а второй сложением (ADD). Почему? Удобно с точки зрения математики.

Посмотрите на эту картинку, она нам еще пригодится дальше
Посмотрите на эту картинку, она нам еще пригодится дальше

А еще с приходом цифры люди догадались, что можно сохранить альфа‑канал вместе с самим изображением, так появились форматы GIF и PNG. С гиф всё просто — пиксель либо прозрачный, либо нет. Но для любого формата сложнее GIF возникает «серая зона» — промежуточная область — где пиксель полупрозрачный. Серые значения в альфе дают антиалайзинг по краям, и вот тут‑то обычно и начинается путаница с premultiplication.

Straight alpha

Во многих 2D‑редакторах и в вебе используется так называемый straight alpha (он же unassociated). Он миксует верхний слой со слоями снизу в пропорции, указанной в альфа‑канале. Всё просто: указано 50 процентов — берём половину верхнего слоя и половину нижнего. Как смеситель в ванной мешает горячую и холодную воду:

Математически это можно выразить так: чтобы получить результат смешивания, нужно цвета верхнего слоя умножить на альфа‑канал, а цвета нижнего слоя (или результат смешивания всех нижних) умножить на его инвертированное значение. Мы это уже видели в виде схемы сверху, можем продублировать формулой:

RGB_{result} = RGB_{ниж} × (1-α) + RGB_{верхн} ×  α

2D‑редакторам проще работать с таким форматом: ластик меняет только альфа‑канал, а картинка остаётся без изменений. При желании можно взять анти‑ластик и вернуть картинку обратно, ничего не потеряв. А ИИшкам можно кодировать секретные меседжи в прозрачных частях изображений

Premultiplied (associated) — формат композа и 3D

В рендере и композе при установке альфа‑канала на 50 процентов мы не получим 50 процентов графической прозрачности: на поверхности может быть блик — он перекроет изображение снизу, хотя прозрачность всё равно останется на уровне 50 процентов.

Полупрозрачная сфера, RGBA и альфа-канал
Полупрозрачная сфера, RGBA и альфа‑канал

Как это работает? Здесь используется другой тип альфа‑канала — premultiplied (associated). Помните первый этап, когда пиксели исходного изображения умножаются на альфа‑канал? В отличие от straight, считается что умножение уже выполнено перед сохранением файла, и еще раз умножать не нужно. Отсюда и название pre + multiplied — предварительно умноженный.

RGB_{result} = RGB_{ниж} × (1-α) + RGB_{верхн} \cancel{×  α }

На визуальном уровне premultiplied alpha показывает не в какой пропорции брать слои, а сколько света, идущего снизу, блокируется слоем. Там, где у straight альфа‑канал на нуле, картинка всегда полностью прозрачна, а у premultiplied — не всегда: в этом месте цвета добавляются, и могут формироваться свечение или блики.

Композитинг изображений с premultiplied alpha

И зачем такое городить, скажете вы? Неужели нельзя обойтись обычным альфа каналом?

Чтобы сделать такое в 2D‑редакторе с straight alpha, вам нужно два слоя: один обычный, второй со свечением в режиме смешивания Add. Тогда как premultiplied alpha может иметь полупрозрачные и светящиеся области одновременно в одном слое.

Если вы сохраните одно и то же изображение с разным альфа каналом, к примеру, вот такой маленький кружок и удалите у него альфа канал, то изображения будут выглядеть так:

Обратите внимание, что у straight alpha пиксель с краев яркий пока альфа канал хотя бы чуть‑чуть больше нуля. Уже потом, на этапе композитинга, альфа канал будет умножен на цвет и цвета с краев перестанут быть резкими. А вот композитинг premultiplied alpha должен исключать второй этап, изображение идет сразу на этап сложения, поэтому у premultiplied пиксели по краям сразу темные.

Композитинг изображений с premultiplied alpha
Композитинг изображений с premultiplied alpha

И вот если случайно изображение с premultiplied alpha попадет в обычный композитинг, пиксели по краям «затемнятся» 2 раза — один раз на этапе сохранения, а второй раз в композе, и вокруг объектов появится черная кайма:

Очевидный пример
Очевидный пример

Мне иногда писали, но ведь в Blender, у меня картинка с прозрачностью, я же её вижу. А в PNG — ее нет.

На что я отвечаю, нет, в Blender вы не видите картинку с прозрачностью — вы видите результат композитинга этой картинки на серый фон с квадратиками.

В Blender используется premultiplied композитинг, в PNG — straight alpha. Мы уже знаем, что чтобы получить из straight alpha формат premultiplied, нужно цвета изображения перемножить с альфа каналом. А чтобы сохранить в PNG, нужно сделать наоборот, то есть на этот альфа канал разделить. Это, естественно, не вызовет никаких проблем до тех пор пока не придется делить на ноль.

И пока математики не придумали как нам делить на ноль, давайте разберем конкретный пример — свечение вокруг объекта. Blender делает его легко и просто: добавляет размытое изображение поверх того что есть, оставляя альфа‑канал нетронутым. И если мы проверим область свечения вокруг объекта — она действительно полностью прозрачна:

При сохранении в PNG альфу нужно привести к straight — если вы этого не сделаете, как вы помните, получится черная кайма. Но что делать с фоном? Как вы помните, нужно разделить цвет фона на 0 (полная прозрачность).

Тут вы скажете: да ладно тебе заливать, что за ерунда. Сделай цвет белым, а яркость пикселя переведи в альфа канал — и PNG все будет прекрасно!

Сама модель straight умеет только миксовать слой и фон, а не добавлять свет поверх. Даже если руками нарисовать альфу вокруг объектов, а цвет сделать ярким, вместо добавления получится смешивание — да, это сработает с белым цветом, но все цвета кроме белого будут блеклыми.

Так что же с этим делать?

Неужели нет способа сохранить свечение? Есть несколько способов, но они не идеальны.

EXR - для композа

Вы можете использовать EXR — там premultiplied alpha, если изображения нужны для композа, это идеальный вариант. Минус — Blender сохраняет EXR без цветовой трансформации. Еще он тяжелее PNG и хуже открывается в бытовых просмотрщиках.

Также можно сохранить в tiff 16bit. По каким-то непонятным мне причинам tiff 8bit сохранется в straight alpha, а 16bit в premultiplied. (Кто хочет разобраться почему вот баг репорт: https://projects.blender.org/blender/blender/issues/99701 )

Для 2D-программ - два слоя

Как перенести свечение в 2D‑программу, которая знает только straight alpha?

Сохраните изображение без альфа‑канала — только RGB. Альфа‑канал инвертируйте и сохраните отдельно — это holdout для фона. В графическом редакторе: инвертированной альфой через Multiply затемняете/маскируете фон, сверху RGB в режиме Add. Картинка будет идентична тому, как она выглядит после рендера.

RGB без альфа канала (или просто сохранить как RGB не RGBA)
RGB без альфа канала (или просто сохранить как RGB не RGBA)
Инвертированная альфа
Инвертированная альфа

Но что если всё‑таки нужен формат PNG?

Честного перевода, как мы уже поняли, нет — но приближение иногда лучше, чем ничего. Давайте попробуем это сделать.

Давайте возьмём для примера этот рендер обезьянок с эффектом свечения.

В первую очередь возьмём ноду Alpha Convert и переведём её в режим Premultiplied. При сохранении в PNG Blender будет переводить изображение в straight alpha, и нам нужно нивелировать этот эффект.

Распределим цвет на составляющие HSV. Поскольку правки нужны только в прозрачной области, выделим эту часть с помощью ноды ColorRamp. В зависимости от задачи вы можете взять больше полупрозрачных областей. Hue и Saturation оставляем без изменений.

Value в прозрачных областях нужно поднять до максимальных значений, иначе вместо свечения возникнет тень. Сделаем это используя ноду Mix:

Степень свечения у нас регулируется альфа‑каналом. Однако мы подрегулируем её с помощью кривых — отредактируйте её на свой вкус. Чем выше середина кривой, тем сильнее будет виден эффект свечения.

В результате должно получиться что‑то такое:

Финальный сетап
Финальный сетап
Слева изображение готовое к преобразованию в PNG, справа - альфа-канал
Слева изображение готовое к преобразованию в PNG, справа — альфа‑канал

Этот способ не заменит вам настоящего premultiplied: свечение не такое чистое и ровное, местами меняется цвет, блики сереют. Как видите, способ не идеальный и всё равно приводит к потере цветовой информации. К тому же на границах непрозрачных объектов может возникнуть ореол. Однако, такой способ всё же лучше, чем ничего.

Что еще посмотреть — почитать:

Комментарии (26)


  1. nin-jin
    31.08.2026 12:32

    В правой картинке, очевидно, зашит чёрный фон, так что на любом другом фоне она будет выглядеть криво - с тёмной окантовкой. Зачем такой формат "прозрачности" хоть кому-то нужен остаётся загадкой.


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

      Да, если смотреть только на RGB, кажется, будто справа «зашит чёрный фон». На самом деле это не фон, а уже выполненное умножение цвета на альфу.

      Такую картинку нельзя просто положить на другой фон как обычный PNG. Её композят так:

      RGB_{фон} × (1 − α) + RGB

      Тогда тёмная кайма не появляется: поскольку изображение сверху добавляется через ADD. Напомню ADD это операция когда цвета становятся ярче, но никак не темнее. Кайма возникает, когда premultiplied принимают за straight и умножают на альфу второй раз — об этом как раз абзац про чёрный контур вокруг огня.

      Зачем так хранить:

      • в одном слое можно держать (и, главное, рендерить) и полупрозрачность, и свечение (огонь, glare, блик), это я указал в статье

      • при мипмапинге и фильтрации такая альфа ведёт себя лучше;

      • рендер, Nuke, Fusion, работают именно с таким типом альфы. Это - стандарт композа.


  1. Starche
    31.08.2026 12:32

    А как для игр экспортят такие текстуры со свечением и нулевой альфой, если в PNG некрасиво? Делают две текстуры и смешивают на рендере? Или другой формат изображений берут?


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

      Просто переключатель в настройках текстуры типа такого: https://docs.unity3d.com/6000.1/Documentation/Manual/urp/blending-modes.html

      По самому файлу не поймёшь, там straight или premultiplied, так же как не поймёшь нормали там direct x или openGL


      1. unC0Rr
        31.08.2026 12:32

        direct x или openGL

        Любопытно, а в чём разница?


        1. Mixail_Soluyanov Автор
          31.08.2026 12:32

          О, у меня есть видос на эту тему: https://www.youtube.com/watch?v=mjbxB1rb9OI

          Если в кратце инвертированы в зеленом канале


          1. Sixshaman
            31.08.2026 12:32

            Прямо сейчас видео посмотреть не могу, но ведь это только для Fixed Function Pipeline? На шейдерах же можно как угодно карты нормалей сделать.


            1. Mixail_Soluyanov Автор
              31.08.2026 12:32

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


        1. Chaos_Optima
          31.08.2026 12:32

          В системе координат, в Dx она леворукая, в огл праворукая(или наоборот, точно не помню) отсюда и разная работа с нормалмапами, потому что они запекаются в тангентспэйсе.


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

      Хороший вопрос на самом деле, я не знаю какой там пайплайн. Я заметил, что если сохранить в tiff, то 8bit выводится straight, а 16bit premultiplied. По идее можно сохранить в 16bit tiff, a потом уже где собирается атлас сохранить во что-то более удобное.


  1. Elbrus128
    31.08.2026 12:32

    Полученные изображения нужно проявить на одну плёнку.

    То ли авто генерация, то ли автор не понимает процессов в плёночной фотографии и киносъёмке.


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

      1. APh
        31.08.2026 12:32

        Ну, так и есть, понимания процессов пленочных кино/фото не было до конца у Вас, а фразу “expose different elements onto the same frame of film” Вы поняли неверно. Expose означает “экспонировать”, а не проявить. Действительно, на светочувствительный материала можно экспонировать несколько изображений. (Да, сколько влезет раз. Мы так в школе развлекались в 5 классе, делая комбинированные съёмки, где человек сам с собой был в нескольких штуках на одном снимке. Не все взрослые умели, но мы читали книги.))) А, потом уже этот светочувствительный материал после серии засветов можно проявить — провести химический процесс превращения скрытого изображения в эмульсии в явное.

        Т. е. изображения можно экспонировать на светочувствительный материал на отдельные кадры множество раз (физический процесс взаимодействия фотонов с галогенидами серебра в светочувствительной эмульсии).

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

        Нельзя “проявить изображения на плёнку”.

        Кстати, в видео это наглядно так и показано: сначала идет экпонирование (засветка) нескольких разных изображений на один и тот же кадр светочувствительного материала (кинопленки), потом она вся разом проявляется, промывается и закрепляется в растворах, после чего все эти наложенные экспозиции (засветки) появляются изображением на одном кадре.

        Засветка несколькими разными изображениями одного и того же светочувствительного кадра очень похожа на несколько полупрозрачных слоев в растровом редакторе.
        Проявка — сведение всех этих отдельных слоёв в выходной однослойный растр.

        Удачи! Пишите исчо! ;-)) Но, материал изучайте плотнее, чтобы таких касузов не выдавать в эфир.


    1. AskePit
      31.08.2026 12:32

      генерация, кругом генерация!


  1. koreec
    31.08.2026 12:32

    Просто скриншот нельзя сделать?


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32


  1. CaptGg
    31.08.2026 12:32

    ПО для композинга обычно поддерживает premultiplied alpha и в формате PNG, нужно просто поставить соответствующую галочку при импорте. Никогда не испытывал с этим проблем, видишь темный контур и сразу знаешь что нужно включить.


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

      Ха-ха, да, но проблема не в импорте, а экспорте. Проблема в том как рендер из Blender сохранить в PNG с premultiplied alpha. До 2.8 можно было выбрать формат при сохранении, а в современных версиях выбора нет.


      1. CaptGg
        31.08.2026 12:32

        Разве Alpha Convert Node вопрос не решает? Blender все равно будет делить альфу для PNG с потерей данных?


  1. cssfish
    31.08.2026 12:32

    насчет Straight alpha: насколько помню, в браузерах будет не 50/50, а

    50% opacity means, 50% of the light is blocked
    50% + (50% * 50%) = 75% opacity.
    

    (это если два слоя по 0.5 миксовать)

    ну или если более точно

    Total Opacity = First Opacity + (100 - First Opacity) * Second Opacity
    

    при этом first - это тот, что снизу.

    сверялся с этим обсуждением и на практике вроде все сходилось


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

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


      1. cssfish
        31.08.2026 12:32

        а, т.е. альфа только у одного.


  1. achekalin
    31.08.2026 12:32

    Полученные изображения нужно проявить на одну плёнку.

    Тут я споткнулся. Не проявить, а снять на одну пленку?


    1. Mixail_Soluyanov Автор
      31.08.2026 12:32

      Ну да, спроецировать, наверное точнее


  1. Error1024
    31.08.2026 12:32

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


  1. Chaos_Optima
    31.08.2026 12:32

    По сути статья не про разные альфы, а по разные способы композа, которых к слову не 2 а гораздо больше. И если говорить про GAPI то каждая операция над текущими данными и бэком настраивается через параметры смешивания.