Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

Куда девается свечение при сохранении в PNG. Два формата прозрачности, о которых почти никто не знает

Дата публикации: 31-08-2026 10:11:31

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

Основное содержимое страницы с новостью.

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

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

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

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

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

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

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

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

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

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

Straight alpha

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

3841e2db9409344e2363804f1f85c63d.png

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

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 может иметь полупрозрачные и светящиеся области одновременно в одном слое.

1f7318ca0d19349f519567a88f5ef5da.png35377b8a098a6c9a05730b6c05628a9b.png

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

Обратите внимание, что у 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 делает его легко и просто: добавляет размытое изображение поверх того что есть, оставляя альфа‑канал нетронутым. И если мы проверим область свечения вокруг объекта — она действительно полностью прозрачна:

449db3f4d35c24b4322463e086a365cb.png

При сохранении в 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)

Инвертированная альфа

Инвертированная альфа

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

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

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

efc4c3b2b1cdf3de8d7e9e2391d7d297.png

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

632c256a1741683fd69b4a9e53139076.png

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

1069955db8a6f84c78f557f924cf5d51.png

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

2b883d80cc98352ff96169c46ceef620.png

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

d58ec2fba9f922d622260e8d311b4d2c.png

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

Финальный сетап

Финальный сетап

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

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

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

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

Схожие новости

#Наименование новостиТональностьИнформативностьДата публикации
1[Перевод] Хорошие инструменты — невидимы07.7226-07-2026
2Как нарисовать заставку или фон для игры в Aseprite5620-06-2026
3Давай сделаем сайт с помощью дизайн-системы? Ты будешь дизайнить гораздо быстрее011.5629-05-2026
4Проблемы Unity, о которых не расскажут в пресс-релизе08.6504-08-2026
5Сколько стоит час практики на курсах веб‑дизайна: считаем по публичным страницам трёх школ08.831-07-2026
6Точечное внедрение Linux на производстве: опыт одного начальника склада08.4330-08-2026
7Кадры вместо видео: как индустрия обходит вес scroll‑scrub анимаций07.1312-08-2026
8СВЕТОВАЯ НАГРУЗКА: ПОЧЕМУ ПОДСВЕТКА ВЕЗДЕ СОЗДАЕТ "ШУМ" И КАК ЭТО ...05.1407-08-2026
9одвесной светильник с травертином Ambrella018.2225-08-2026

Классификация: Мнения. Схожих патентов: 0. Схожих новостей: 9. Тональность: 0. Информативность: 7.82. Источник: habr.com.