Straight и premultiplied RGB — разные данные
Пиксель со straight alpha хранит цвет отдельно от прозрачности. В premultiplied RGB цвет уже умножен на альфу. Оба варианта могут давать одинаковый видимый результат, но им нужны соответствующие blend factors.
Возьмём линейный красный RGB (1, 0, 0) с альфой 0,25 на чёрном. Straight-alpha blending даёт красный 0,25. Если в исходнике уже записано 0,25 и снова умножить его на альфу, получится 0,0625. Повторное умножение затемняет край. Это пример в линейном пространстве: не смешивайте сырые sRGB-байты с линейной арифметикой.
Straight: RGB = (1, 0, 0), alpha = 0.25
Premultiplied: RGB = (0.25, 0, 0), alpha = 0.25
Верно на чёрном: red = 0.25
Повторное умножение: 0.25 × 0.25 = 0.0625Согласуйте формулу смешивания с текстурой
Для обычного straight-alpha цвета исходный RGB умножается на альфу и складывается с фоном, взвешенным по one minus source alpha. Для premultiplied источника RGB-множитель обычно One. Изменение соглашения изображения без изменения шейдера поэтому меняет результат.
При рендере в прозрачную текстуру отдельно важен альфа-канал. Если для него использовать исходный RGB-множитель, альфа может возводиться в квадрат. Отдельные alpha factors One и OneMinusSrcAlpha сохраняют ожидаемую накопленную прозрачность в типичном source-over случае. Точные настройки зависят от материала и пайплайна: одну формулу не стоит бездумно переносить во все эффекты.
Пример source-over для straight RGB:
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
Пример source-over для premultiplied RGB:
Blend One OneMinusSrcAlpha, One OneMinusSrcAlphaОтличайте фильтрацию от ошибки blending
Если кайма возникает только при масштабировании или вращении, фильтрация может захватывать RGB прозрачных соседних пикселей. Если край похож на соседний кадр анимации, проверьте сетку атласа и фильтрацию на границах ячеек. Сравните одну ячейку в исходном и игровом размере.
Проверьте разумность RGB в прозрачных пикселях рядом с краем. Alpha Is Transparency может помочь обычным импортированным текстурам Unity, но не является универсальным исправлением premultiplication mismatch. Изображению без альфы всё равно нужен осмысленный источник прозрачности.
Дым и аддитивный огонь требуют разных решений
Дым обычно перекрывает сцену за ним. Аддитивные огонь и искры преимущественно добавляют светящийся цвет: на чёрном они могут быть сильными, а на белом — слабыми. Это часть назначения материала, а не обязательно ошибка экспорта.
В glTF OPAQUE, MASK и BLEND задают разные способы работы с альфой материала. Спецификация также требует хранить texel base color без premultiplication. Это правило данных материала glTF, а не всех пользовательских текстур частиц в Unity.
Повторяемый порядок диагностики
Во время проверки фиксируйте камеру, экспозицию и цветовое пространство. Скриншоты нужно накладывать на одинаковый фон либо приводить к одному представлению альфы. Большая ошибка RGB в невидимых пикселях не обязательно является видимым дефектом.
- Проверьте исходную альфу и один показательный кадр.
- Определите, хранится RGB как straight или premultiplied.
- Проверьте blend factors, включая альфу прозрачного render target.
- Сравните чёрный, серый и белый фон без постобработки.
- Проверьте масштабированные и повёрнутые виды на артефакты фильтрации.
- Только затем корректируйте художественный цвет, эмиссию и прозрачность.