前端开发
在 PixiJS v8 中用 blendMode…
当需要在 PixiJS v8 中用 GPU 混合或滤镜方式合成 Sprite/Container,并优化批处理与避免静默回退时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 PixiJS v8 中用 blend特定
解决思路
- 通过设置 `container.blendMode` 使用 GPU 混合方程合成显示对象(标准模式)或基于滤镜的高级模式。
- 按相同 `blendMode` 将相邻兄弟显示对象分组,因为混合模式切换会打断渲染批次。
- Quick Start:加载贴图后设置 `light.blendMode = "add"` 并 `app.stage.addChild(light)`;`multiply` 同理;使用高级模式时先 `import "pixi.js/advanced-blend-modes"`,再设置 `overlay.blendMode = "color-burn"` 并加入舞台。
- 标准模式内置且直接使用 GPU 混合方程:`normal`(标准 alpha 合成,根节点有效默认)、`add`(加法/提亮/发光)、`multiply`(正片叠底/变暗/阴影)、`screen`(滤色/提亮/减淡)、`erase`(从渲染目标擦除像素)、`none`(无混合,覆盖目标)、`inherit`(从父级继承,实际默认值)、`min`(保留源和目标最小值,仅 WebGL2+)、`max`(保留源和目标最大值,仅 WebGL2+)。
- 标准模式硬件加速且开销低,不需要滤镜。
- 高级模式需要显式 `import "pixi.js/advanced-blend-modes"` 注册扩展;在 WebGL 渲染器上还必须在 `app.init` 时设置 `useBackBuffer: true`,否则 PixiJS 记录警告并静默回退。
- 设置高级模式与标准模式相同,都是通过 `blendMode` 属性。
- 高级模式内部使用滤镜,因此比标准模式成本更高。
- 可用高级模式包括:`color-burn`(通过增加对比度变暗)、`color-dodge`(通过降低对比度提亮)、`darken`(保留两层中较暗者)、`difference`(绝对差)、`divide`(下层除以上层)、`exclusion`(类似 difference,对比度更低)、`hard-light`(根据上层进行 multiply 或 screen)、`hard-mix`(高对比度阈值混合)、`lighten`(保留较亮者)、`linear-burn`(通过相加和相减变暗)、`linear-dodge`(图层相加)、`linear-light`(根据上层进行 linear burn 或 linear dodge)、`luminosity`(上层的明度,下层的色相/饱和度)、`negation`(反向 difference)、`overlay`(根据下层进行 multiply 或 screen)、`pin-light`(基于明度比较替换)、`saturation`(上层的饱和度,下层的色相/明度)、`soft-light`(柔和 overlay 效果)、`subtract`(下层减去上层)、`vivid-light`(根据上层进行 color burn 或 color dodge)、`color`(上层的色相和饱和度,下层的明度)。
- Batch-friendly ordering:不同混合模式会打断渲染批次,通过排序子对象最小化切换;例如 `screen, screen, normal, normal` 产生 2 次 draw call,而 `screen, normal, screen, normal` 产生 4 次。
- 避免未导入 advanced-blend-modes 扩展:先 `import "pixi.js/advanced-blend-modes"`,高级模式才可用;否则无效模式会静默回退到 normal。
- 避免相邻对象混用不同混合模式:将相同混合模式的子对象排序为相邻。
- 避免使用 v7 的 `BLEND_MODES` 枚举:v8 中 `BLEND_MODES` 仅是 TypeScript 类型(字符串字面量联合),没有运行时枚举导出;应直接写字符串,例如 `sprite.blendMode = "add"`,而不是 `BLEND_MODES.ADD`。
- 避免高级混合模式缺少 `useBackBuffer`:先 `import "pixi.js/advanced-blend-modes"`,再 `await app.init({ useBackBuffer: true });`;高级模式读取 back buffer,WebGL 上未启用会静默回退,WebGPU 会无条件启用 back buffer。
- 避免高级混合模式在高 DPI 渲染器上被裁剪或缩放:高级模式基于滤镜,使用 `Filter.defaultOptions`,其 `resolution` 默认是 `1`;在创建受影响对象之前设置 `Filter.defaultOptions.resolution = "inherit";`,使其按渲染目标分辨率渲染;此设置会增加内存和运行时成本,只在保真度重要处使用。
- API 参考:`Container.blendMode`、`OverlayBlend`、`ColorBurnBlend`、`ColorDodgeBlend`、`HardLightBlend`、`SoftLightBlend`、`DifferenceBlend`。
适用边界 · 注意事项
- 不适用于 PixiJS v7 及更早版本;这些字符串 blendMode 和 `BLEND_MODES` 仅类型的行为属于 v8。
- 当 WebGL 环境不能或不愿设置 `useBackBuffer: true` 时,不要依赖高级混合模式,因为它们会静默回退。
- 不需要复杂混合效果或内存/运行时受限时,避免使用高级混合模式和 `Filter.defaultOptions.resolution = "inherit"`,因为二者都会增加渲染成本。