phaserjs/phaser1 file

V3 To V4 Migration

Use this skill when migrating a Phaser 3 project to Phaser 4, or when a user asks about breaking changes, API differences, or how to update their v3 code. Covers renderer changes (pipelines to render nodes), FX/masks to filters, tint system, camera matrix, texture coordinates, DynamicTexture, shaders, lighting, removed game objects, and a full migration checklist. Triggers on: migrate, upgrade, v3 to v4, breaking changes, Phaser 3 to 4, migration guide, update from v3.

Specification
Skill ID
phaserjs/phaser/v3-to-v4-migration
Publisher
phaserjs
Repository
phaser
Installs
0
Files
1
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

phaserjs/phaser/v3-to-v4-migrationInstalls these files
  • SKILL.md

What this skill tells the agent

Phaser v3 to v4 Migration Guide

This guide covers everything you need to change when upgrading a Phaser v3 project to Phaser v4. It is organized from highest-impact changes to smaller details, so you can work through it top-to-bottom.

Related skills: ../v4-new-features/SKILL.md, ../game-setup-and-config/SKILL.md, ../filters-and-postfx/SKILL.md


Table of Contents

  1. Renderer: Pipelines to Render Nodes
  2. Canvas Renderer Deprecated
  3. FX and Masks are now Filters
  4. Tint System
  5. Camera System
  6. Texture Coordinates and GL Orientation
  7. DynamicTexture and RenderTexture
  8. Shader API
  9. GLSL Loading
  10. Lighting
  11. TileSprite
  12. Graphics and Shape
  13. Geometry: Point Replaced by Vector2
  14. Math Constants
  15. Data Structures
  16. Round Pixels
  17. Removed Game Objects
  18. Removed Plugins and Entry Points
  19. Removed Utilities and Polyfills
  20. Spine Plugins
  21. Miscellaneous Breaking Changes
  22. Migration Checklist

1. Renderer: Pipelines to Render Nodes

Phaser v4 contains a brand-new WebGL renderer. The entire rendering pipeline from v3 has been replaced. This is the single biggest change in v4.

What was removed:

The v3 Pipeline system has been removed entirely. Pipelines frequently held multiple responsibilities (e.g. the Utility pipeline handled various different rendering tasks) and each had to manage WebGL state independently, leading to conflicts where one pipeline could break another's assumptions.

What replaced it:

The new RenderNode architecture. Each render node handles a single rendering task, making the system more maintainable. All render nodes have a run method, and some have a batch method to assemble state from several sources before invoking run.

What this means for you:

  • If your game only uses the standard Phaser API (Sprites, Text, Tilemaps, etc.), the new renderer should work transparently.
  • If you wrote custom WebGL pipelines in v3, they will need to be rewritten as render nodes. Use RenderConfig#renderNodes to register custom render nodes at boot.
  • If you accessed WebGLRenderer internals directly, be aware that many internal properties have been removed or restructured:
  • WebGLRenderer.textureIndexes is removed. Use glTextureUnits.unitIndices instead.
  • WebGLRenderer#genericVertexBuffer and #genericVertexData are removed (freeing ~16MB RAM/VRAM). BatchHandler render nodes now create their own WebGL data buffers.
  • WebGLAttribLocationWrapper is removed.
  • Do not make direct WebGL gl calls in a Phaser v4 game. This can change the WebGL state without updating the internal WebGLGlobalWrapper, causing unpredictable behavior. If you need direct WebGL access, use an Extern game object, which resets state after it finishes.

2. Canvas Renderer Deprecated

The Canvas renderer is still available but should be considered deprecated. Canvas rendering does not support any of the WebGL techniques used in v4's advanced rendering features. As WebGL support is effectively baseline today, we recommend WebGL for all new projects.

Canvas retains one advantage: 27 blend modes vs WebGL's 4 native modes (NORMAL, ADD, MULTIPLY, SCREEN). In v4, the new Blend filter can recreate all Canvas blend modes in WebGL, though it requires indirection through a CaptureFrame, DynamicTexture, or similar.


3. FX and Masks are now Filters

This is one of the most impactful changes for v3 users who relied on the FX or Mask systems.

What changed:

FX (pre and post) and Masks have been unified into a single Filter system. A Filter takes an input image and produces an output image, usually via a single shader. All filters are mutually compatible.

Key differences from v3:

  • No more preFX/postFX distinction. Filters are divided into internal (affects just the object) and external (affects the object in its rendering context, usually the full screen) lists.
  • No more object restrictions. In v3, only certain objects supported FX. In v4, filters can be applied to any game object or scene camera, including Extern objects.
  • `BitmapMask` removed. Use the new Mask filter instead. GeometryMask remains available in Canvas only.

Removed derived FX and their replacements:

v3 FXv4 Replacement
BloomPhaser.Actions.AddEffectBloom()
ShinePhaser.Actions.AddEffectShine()
CirclePhaser.Actions.AddMaskShape()
GradientGradient game object

ColorMatrix change:

The ColorMatrix filter shifted its color management methods onto a colorMatrix property:

// v3
colorMatrix.sepia();

// v4
colorMatrix.colorMatrix.sepia();

Mask migration:

// v3 - BitmapMask
const mask = new Phaser.Display.Masks.BitmapMask(scene, maskObject);
sprite.setMask(mask);

// v4 - Mask filter
sprite.filters.internal.addMask(maskObject);

4. Tint System

The tint system has been overhauled with a new API and additional blend modes.

Removed:

  • tintFill property
  • setTintFill() method

Replacement:

  • Use the new tintMode property or setTintMode() method to control tint blending.
  • Phaser.TintModes enumerates the available modes: MULTIPLY, FILL, ADD, SCREEN, OVERLAY, HARD_LIGHT.

How to convert your code:

// v3
sprite.setTintFill(0xff0000);

// v4
sprite.setTint(0xff0000).setTintMode(Phaser.TintModes.FILL);

Other tint changes:

  • tint and setTint() now purely affect color settings. In v3, calling these would silently deactivate fill mode.
  • FILL mode now treats partial alpha correctly.
  • BitmapText tinting now works correctly.

5. Camera System

The camera matrix system has been rewritten. If you only use standard camera properties (scrollX, scrollY, zoom, rotation), your code should work without changes. However, if you access camera matrices directly, you must update your code.

What changed:

v3v4
Camera#matrix = position + rotation + zoomCamera#matrix = rotation + zoom + scroll (no position)
Scroll appended separatelyScroll is part of Camera#matrix
No equivalentCamera#matrixExternal = position only
No equivalentCamera#matrixCombined = matrix * matrixExternal

If you manipulated scroll factors manually:

// v3
spriteMatrix.e -= camera.scrollX * src.scrollFactorX;

// v4
TransformMatrix.copyWithScrollFactorFrom(matrix, scrollX, scrollY, scrollFactorX, scrollFactorY);

Other camera changes:

  • GetCalcMatrix() now takes an additional ignoreCameraPosition parameter.
  • GetCalcMatrixResults now includes a matrixExternal property.

6. Texture Coordinates and GL Orientation

Phaser v3 used top-left orientation for textures, which caused mismatches internally (framebuffers drawn upside-down, then flipped). Phaser v4 uses GL orientation throughout, where Y=0 is at the bottom.

Action required:

  • If you use compressed textures, they must be re-compressed with the Y axis starting at the bottom and increasing upwards. This is usually available as a "flip Y" option in your texture compression software.
  • Standard image textures (PNG, JPG, etc.) are handled automatically -- no action needed.

Use this skill in a project

Open any RiverX project, search the Skills panel for phaserjs/phaser/v3-to-v4-migration, and install it in one click.

Use this skill