Straight and premultiplied RGB are different data
A straight-alpha pixel keeps its colour independently from opacity. A premultiplied pixel stores colour already multiplied by alpha. Both conventions can represent the same visible result, but they need compatible blend factors.
Consider linear red RGB (1, 0, 0) at alpha 0.25 over black. Straight-alpha blending produces red 0.25. If the stored red is already 0.25 and it is multiplied by alpha again, the result becomes 0.0625. That double multiplication makes the edge too dark. These numbers are a linear-colour example; do not mix raw sRGB bytes with linear arithmetic.
Straight: RGB = (1, 0, 0), alpha = 0.25
Premultiplied: RGB = (0.25, 0, 0), alpha = 0.25
Correct over black: red = 0.25
Double multiplication: 0.25 × 0.25 = 0.0625Use the blend equation that matches the texture
For ordinary straight-alpha colour, source RGB is multiplied by source alpha and added to the background weighted by one minus source alpha. A premultiplied source generally uses One for its RGB source factor instead. Changing only the image convention without changing the shader can therefore change appearance.
When rendering into a transparent target, alpha needs attention too. Using the RGB source factor for the alpha channel can square alpha. A separate alpha blend such as One and OneMinusSrcAlpha preserves the expected accumulated opacity for this common source-over case. The correct settings depend on the material and pipeline; do not paste one blend state into every effect.
Straight RGB source-over example:
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
Premultiplied RGB source-over example:
Blend One OneMinusSrcAlpha, One OneMinusSrcAlphaSeparate filtering seams from blend mistakes
If the fringe appears only when the sprite is scaled or rotated, filtering may be sampling RGB from transparent neighbours. If the fringe resembles an adjacent animation frame, the atlas layout or cell-edge filtering may be involved. Inspect one cell at native resolution and then at gameplay size.
Check whether transparent pixels carry sensible RGB near the edge. Unity’s Alpha Is Transparency processing can help ordinary imported textures, but it is not a universal fix for a premultiplication mismatch. A source image with no alpha still needs an intentional opacity source.
Smoke and additive fire should not share every assumption
Smoke normally needs to obscure the scene behind it. Additive fire and sparks primarily add light-looking colour; they can look strong on black and weak on white. This difference is part of the material’s purpose, not necessarily a broken export.
In glTF, OPAQUE, MASK and BLEND describe different material alpha behaviours. The specification also requires base-colour texels not to be stored premultiplied. That rule describes glTF material data, not every custom Unity particle texture you might use.
A repeatable debugging order
Keep the camera, exposure and colour space fixed while debugging. If you compare screenshots, composite both images over the same background or convert them to the same alpha representation first. Large RGB differences in invisible pixels do not necessarily describe a visible defect.
- Inspect the source alpha and one representative frame.
- Confirm whether RGB is straight or premultiplied.
- Check shader blend factors, including the alpha factors for transparent targets.
- Test black, grey and white backgrounds with no post-processing.
- Check scaled and rotated views for filtering artefacts.
- Only then adjust the artistic colours, emission or opacity.