v4-new-features
phaserjs/phaser
在学习 Phaser 4 中新增的功能、游戏对象、组件和渲染能力时,请运用此技巧。内容涵盖滤镜、渲染节点、帧捕获、渐变、噪点、SpriteGPULayer、TilemapGPULayer、照明组件、渲染步骤以及新的色调模式。 触发条件:v4 新增内容、Phaser 4 功能、RenderNode、SpriteGPULayer、CaptureFrame、Gradient 游戏对象、Noise 游戏对象、新的色调模式。若需将 v3 代码迁移至 v4,请参阅“v3 到 v4 迁移”技能。
...展开全部Phaser 4 的新功能
Phaser 4 的新功能与特性: 滤镜(取代 FX/BitmapMask)、渲染节点(取代管道)、CaptureFrame、渐变、噪点游戏对象、SpriteGPULayer、TilemapGPULayer、照明组件、渲染步骤以及新的色调模式。
相关技能文档:../v3-to-v4-migration/SKILL.md、../filters-and-postfx/SKILL.md、../game-object-components/SKILL.md、../tilemaps/SKILL.md
正在从 v3 迁移?请参阅《v3 到 v4 迁移指南》,了解分步代码更改、已移除的 API 以及迁移检查清单。
概述:v4 中的变更
Phaser 4 对 WebGL 渲染引擎进行了全面重构。v3 渲染器允许每个子系统独立管理 WebGL 状态,这会导致冲突(例如某些特效破坏遮罩)。v4 通过 RenderNode 图集中化了 WebGL 状态管理,其中每个节点仅处理一个渲染任务。
关键移除项
主要新增功能
- 新增 GameObject:
CaptureFrame、Gradient、Noise、NoiseCell2D/3D/4D、NoiseSimplex2D/3D、SpriteGPULayer、Stamp、TilemapGPULayer - 新增组件:
Lighting、RenderSteps、RenderNodes - 新增色调模式:
MULTIPLY、FILL、ADD、SCREEN、OVERLAY、HARD_LIGHT - 新增滤镜:Blend、Blocky、CombineColorMatrix、GradientMap、ImageLight、Key、Mask、NormalTools、PanoramaBlur、ParallelFilters、Quantize、Sampler、Threshold
- GL 方向:v4 采用标准 GL 方向(纹理的 Y=0 位于底部)
滤镜系统(取代 FX 和 BitmapMask)
完整参考文档:
filters-and-postfx.md
滤镜系统整合了 v3 版本的 FX 和 Mask 系统。每个滤镜都接收一张输入图像,并通过着色器处理生成输出图像。滤镜可应用于任何游戏对象或摄像机——而 v3 版本对支持 FX 的对象存在限制。
// v3 方法(FX):
sprite.preFX.addGlow(0xff00ff,4);
sprite.postFX.addBlur(0,2,2,1);// v4 方法(滤镜):
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff,4,0,1);
sprite.filters.external.addBlur(0,2,2,1);// v3 方法(位图蒙版):
constmask =new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// v4 方法(FilterMask):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);
内部与外部:内部滤镜在摄像机变换之前运行(对象局部空间,开销更低)。外部滤镜在摄像机变换之后运行(屏幕空间,全分辨率)。
渲染节点(取代管道)
在 v3 中,管道(Pipeline)是一种通常处理多项任务的渲染系统。在 v4 中,每个渲染节点(RenderNode)通过其run()方法处理单一渲染任务。某些节点还提供batch()方法,用于在绘制前累积状态。
架构
RenderNodeManager(位于 WebGL 渲染器上)管理所有渲染节点。游戏对象通过基于角色的映射来引用节点。
// 游戏对象上的渲染节点角色:
// - 'Submitter':为每个元素运行其他节点角色
// - 'Transformer':提供顶点坐标
// - 'Texturer':处理纹理// 游戏对象具有默认和自定义的渲染节点映射:
gameObject.defaultRenderNodes // 按角色划分的内置节点
gameObject.customRenderNodes // 按角色划分的覆盖项
gameObject.renderNodeData // 以节点名称为键的数据
设置自定义渲染节点
// 覆盖特定的渲染角色:
gameObject.setRenderNodeRole('Submitter','MyCustomSubmitter');// 向渲染节点传递数据:
gameObject.setRenderNodeRole('Transformer','MyTransformer', {
customProperty:42
});// 移除自定义节点(恢复为默认值):
gameObject.setRenderNodeRole('Submitter',null);
内置渲染节点类型
批处理处理程序(每次绘制调用中累积并绘制多个对象):
BatchHandlerQuad-- 标准四边形批处理(Image、Sprite、BitmapText 等)BatchHandlerQuadSingle-- 单四边形变体BatchHandlerTileSprite-- TileSprite 批处理BatchHandlerTriFlat—— 平面三角形批处理(Graphics、Shape)BatchHandlerPointLight—— 点光源批处理BatchHandlerStrip-- 三角带批处理
提交器(按对象类型协调渲染):
SubmitterQuad、SubmitterTile、SubmitterTileSpriteSubmitterSpriteGPULayer、SubmitterTilemapGPULayer
变换器(计算顶点位置):
TransformerImage、TransformerStamp、TransformerTile、TransformerTileSprite
纹理器(管理纹理绑定):
纹理器图像、纹理器贴图精灵
滤镜(后处理——参见filters-and-postfx.md):
BaseFilter、BaseFilterShaderFilterBarrel、FilterBlend、FilterBlocky、FilterBlur(低/中/高三种变体)FilterBokeh、FilterColorMatrix、FilterCombineColorMatrixFilterDisplacement、FilterGlow、FilterGradientMap、FilterImageLightFilterKey、FilterMask、FilterNormalTools、FilterPanoramaBlurFilterParallelFilters、FilterPixelate、FilterQuantizeFilterSampler、FilterShadow、FilterThreshold、FilterVignette、FilterWipe
其他:
Camera、FillCamera、FillRect、FillPath、FillTriDrawLine、StrokePath、ShaderQuad列表合成器、重新绑定上下文、释放上下文动态纹理处理器
继承自:自定义渲染节点
// 注册自定义节点构造函数:
renderer.renderNodes.addNodeConstructor('MyNode',MyNodeClass);// 或添加预构建的节点实例:
renderer.renderNodes.addNode('MyNode', myNodeInstance);
新游戏对象
CaptureFrame
将当前帧缓冲区的内容捕获到纹理中,位置位于其在显示列表中的当前位置。本身不会进行任何渲染。仅限 WebGL。
// 显示列表中位于此处上方的一切内容都会被捕获:
constimage1 =this.add.image(400,300,'background');// 在摄像机上启用帧缓冲区功能:
this.cameras.main.setForceComposite(true);// 创建捕获点:
constcapture =this.add.captureFrame('myCapturedTexture');// 在另一个对象上使用捕获的纹理:
constoverlay =this.add.image(400,300,'myCapturedTexture');
// 为叠加层添加滤镜以扭曲捕获的场景
关键细节:
- 需要
camera.setForceComposite(true)或帧缓冲区上下文(滤镜、动态纹理、具有部分透明度的摄像机) - 在带有滤镜的容器内,仅捕获该容器中的内容
- 将
visible设置为 false将停止捕获 - 组件:BlendMode、Depth、RenderNodes、Visible
来源:src/gameobjects/captureframe/CaptureFrame.js
渐变
显示由 GPU 渲染的颜色渐变。继承自Shader。支持线性、径向及其他形状模式,并可通过包含ColorBand对象的可配置ColorRamp进行设置。
// 简单的线性渐变:
constgrad =this.add.gradient(undefined,100,100,200,200);// 包含多个颜色带的复杂径向渐变:
consthalo =this.add.gradient({
bands: [
{start:0.5,end:0.6,colorStart: [0.5,0.5,1,0],colorEnd:0xffffff,colorSpace:1,interpolation:4},
{start:0.6,end:1,colorStart:0xffffff,colorEnd: [1,0.5,0.5,0],colorSpace:1,interpolation:3}
],
dither:true,
repeatMode:1,
shapeMode:2, // 径向
start: {x:0.5,y:0.5},
shape: {x:0.5,y:0.0}
},400,300,800,800);// 动画效果:
halo.offset=0.1* (1+Math.sin(time /1000));
关键细节:
- 配置:
GradientQuadConfig,包含色带、shapeMode、repeatMode、start、shape、dither - 颜色通过
ColorRamp配合ColorBand对象定义(支持 HSV 及多种插值模式) - 在运行时修改渐变数据后调用
gradient.ramp.encode()
来源:src/gameobjects/gradient/Gradient.js
噪声游戏对象
所有噪声类型均继承自Shader,且仅支持 WebGL。提供六种变体:
// 基本白噪声:
constnoise =this.add.noise({
noiseOffset: [0,0],
noisePower:1
},100,100,256,256);// 可自定义的细胞噪声:
constcells =this.add.noiseCell2D({
noiseOffset: [0,0],
noiseIterations:3,
noiseNormalMap:true // 作为法线贴图输出以实现光照效果
},200,200,256,256);// 用于自然效果的单纯形噪声:
constsimplex =this.add.noiseSimplex2D({
noiseFlow:0, // 通过动画控制其演变
噪声迭代次数:4,
噪声扭曲量:0.5, // 湍流
噪声种子:42,
噪声法线贴图:false
},300,300,256,256);
各类噪声共有的属性:
noiseOffset--[x, y]数组,用于平移图案噪声幂次-- 调整输出强度(数值越大,对高值的抑制效果越强)noiseNormalMap-- 输出法线贴图(用于光照整合)noiseIterations-- 细节级别(适用于细胞型/单纯形类型)
数学等效函数:Phaser.Math.Hash()、Phaser.Math.HashCell()、Phaser.Math.HashSimplex()
来源:src/gameobjects/noise/
SpriteGPULayer
通过将数据存储在静态 GPU 缓冲区中,可在单次渲染调用中渲染数量极大的四边形(多达数百万个)。速度比单独渲染精灵快达 100 倍。仅限 WebGL。
constlayer =this.add.spriteGPULayer(texture, size);// size = 成员的最大数量// 添加成员(请一次性完成,而非分批添加):
constmember = {x:100,y:200,frame:'tree',scaleX:1,scaleY:1,alpha:1};
layer.addMember(member);// 当条目数量达数百万时,为提高效率请复用成员对象:
member.x=300;
member.y=400;
member.frame='bush';
layer.addMember(member);// 在图层上启用光照:
layer.setLighting(true);
关键细节:
- 仅支持单一纹理(不支持多图集),每个图层仅限一张图像
- 成员支持在创建时定义的类似补间动画的效果(淡入淡出、弹跳、波浪、颜色偏移)
- 更新缓冲区内容开销较大——请一次性填充后保持不变
- 建议像素艺术使用2的幂大小的纹理,以避免接缝
- 通过将
scaleX/scaleY/alpha设置为 0 来“移除”成员(避免缓冲区重建) - 组件:Alpha、BlendMode、Depth、ElapseTimer、Lighting、Mask、RenderNodes、TextureCrop、Visible
来源:src/gameobjects/spritegpulayer/SpriteGPULayer.js
新组件
完整组件参考:
game-object-components.md
Lighting 组件
取代了 v3 中通过分配光照管道的方式。仅限 WebGL。
// v3 方法:
sprite.setPipeline('Light2D');// v4 方法:
sprite.setLighting(true);// 自阴影(通过纹理亮度模拟表面阴影):
sprite.setSelfShadow(true,0.5,1/3);
// 参数:enabled、penumbra(数值越低,边缘越锐利)、diffuseFlatThreshold(0-1)// 使用全局默认值设置自阴影:
sprite.setSelfShadow(null); // 从 config.render.selfShadow 读取
支持对象:BitmapText、Blitter、Graphics、Shape、Image、Sprite、Particles、SpriteGPULayer、Stamp、Text、TileSprite、Video、TilemapLayer、TilemapGPULayer。
批处理注意事项:光照会改变着色器,从而破坏批处理。为获得最佳性能,请将受光照影响的对象和不受光照影响的对象分别分组。
来源:src/gameobjects/components/Lighting.js
RenderSteps 组件
允许将自定义逻辑注入游戏对象的渲染过程中。仅限 WebGL。滤镜系统内部使用 RenderSteps。
// 添加自定义渲染步骤:
gameObject.addRenderStep(function(renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
// 此处为自定义渲染逻辑
// 准备就绪后调用下一步:
varnextFn = gameObject._renderSteps[renderStep +1];
if(nextFn) {
nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep +1, displayList, displayListIndex);
}
});
关键细节:
- 渲染步骤存储在
_renderSteps数组中,通过renderWebGLStep()执行 - 第一步首先执行,并负责调用后续步骤
- 这就是滤镜如何延迟并控制
renderWebGL流程的方式
来源:src/gameobjects/components/RenderSteps.js
RenderNodes 组件
为游戏对象提供defaultRenderNodes、customRenderNodes 和renderNodeData映射。用法请参见上文的“RenderNodes”部分。
来源:src/gameobjects/components/RenderNodes.js
TilemapGPULayer
完整的瓦片地图参考文档:
tilemaps.md
基于 GPU 的高性能瓦片地图渲染。通过专用着色器将整个图层渲染为单个四边形。仅限 WebGL。
// 通过 Tilemap 并启用 gpu 标志创建:
constmap =this.make.tilemap({key:'level1'});
consttileset = map.addTilesetImage('tiles','tilesImage');
constgpuLayer = map.createLayer('Ground', tileset,0,0,true); // 最后一个参数:gpu = true
功能:
- 单个贴图集,配单张纹理图像
- 最多支持 4096x4096 个地砖,最多 2^23 个唯一地砖 ID
- 支持瓦片翻转和动画
- 仅支持正交瓦片地图(不支持等距/六边形)
- LINEAR 模式下完美纹理过滤(无贴图接缝)
- 计算成本按像素计算,而非按贴图计算——即使可见贴图数量众多,也不会造成性能损失
限制:
- 无法使用多个贴图集
- 编辑时需手动调用
generateLayerDataTexture()进行更新 - 仅支持正交投影
内部数据:瓦片数据存储在纹理中(每块瓦片 4 字节:2 个翻转位、1 个动画位、1 个未使用位、28 位瓦片索引)。动画数据存储在单独的纹理中。
来源:src/tilemaps/TilemapGPULayer.js
有关详细的配置选项、API 参考表和源文件映射,请参阅参考指南。
Phaser 4 New Features
New features and capabilities in Phaser 4: Filters (replacing FX/BitmapMask), RenderNodes (replacing Pipelines), CaptureFrame, Gradient, Noise game objects, SpriteGPULayer, TilemapGPULayer, Lighting component, RenderSteps, and new tint modes.
Related skills: ../v3-to-v4-migration/SKILL.md, ../filters-and-postfx/SKILL.md, ../game-object-components/SKILL.md, ../tilemaps/SKILL.md
Migrating from v3? See the v3 to v4 Migration Guide for step-by-step code changes, removed APIs, and a migration checklist.
Overview: What Changed in v4
Phaser 4 is a complete overhaul of the WebGL rendering engine. The v3 renderer let each subsystem manage WebGL state independently, causing conflicts (e.g. certain FX breaking Masks). v4 centralizes WebGL state management through a RenderNode graph, where each node handles exactly one rendering task.
Key Removals
Key Additions
- New GameObjects:
CaptureFrame,Gradient,Noise,NoiseCell2D/3D/4D,NoiseSimplex2D/3D,SpriteGPULayer,Stamp,TilemapGPULayer - New Components:
Lighting,RenderSteps,RenderNodes - New Tint Modes:
MULTIPLY,FILL,ADD,SCREEN,OVERLAY,HARD_LIGHT - New Filters: Blend, Blocky, CombineColorMatrix, GradientMap, ImageLight, Key, Mask, NormalTools, PanoramaBlur, ParallelFilters, Quantize, Sampler, Threshold
- GL Orientation: v4 uses standard GL orientation (Y=0 at bottom for textures)
Filters System (Replacing FX and BitmapMask)
Full reference:
filters-and-postfx.md
Filters unify the v3 FX and Mask systems. Every filter takes an input image and produces an output image via a shader pass. Filters can be applied to any game object or camera -- v3 had restrictions on which objects supported FX.
// v3 approach (FX):
sprite.preFX.addGlow(0xff00ff, 4);
sprite.postFX.addBlur(0, 2, 2, 1);// v4 approach (Filters):
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff, 4, 0, 1);
sprite.filters.external.addBlur(0, 2, 2, 1);// v3 approach (BitmapMask):
const mask = new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// v4 approach (FilterMask):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);
Internal vs External: Internal filters run before the camera transform (object-local space, cheaper). External filters run after (screen space, full-resolution).
RenderNodes (Replacing Pipelines)
In v3, a Pipeline was a rendering system that often handled multiple responsibilities. In v4, each RenderNode handles a single rendering task via its run() method. Some nodes also have a batch() method to accumulate state before drawing.
Architecture
The RenderNodeManager (on the WebGL renderer) owns all render nodes. Game objects reference nodes through role-based maps.
// RenderNode roles on a game object:
// - 'Submitter': runs other node roles for each element
// - 'Transformer': provides vertex coordinates
// - 'Texturer': handles textures// GameObjects have default and custom render node maps:
gameObject.defaultRenderNodes // built-in nodes per role
gameObject.customRenderNodes // overrides per role
gameObject.renderNodeData // data keyed by node name
Setting Custom RenderNodes
// Override a specific render role:
gameObject.setRenderNodeRole('Submitter', 'MyCustomSubmitter');// Pass data to a render node:
gameObject.setRenderNodeRole('Transformer', 'MyTransformer', {
customProperty: 42
});// Remove a custom node (falls back to default):
gameObject.setRenderNodeRole('Submitter', null);
Built-in RenderNode Types
Batch Handlers (accumulate and draw multiple objects per draw call):
BatchHandlerQuad-- standard quad batching (Image, Sprite, BitmapText, etc.)BatchHandlerQuadSingle-- single-quad variantBatchHandlerTileSprite-- TileSprite batchingBatchHandlerTriFlat-- flat triangle batching (Graphics, Shape)BatchHandlerPointLight-- point light batchingBatchHandlerStrip-- triangle strip batching
Submitters (coordinate rendering per object type):
SubmitterQuad,SubmitterTile,SubmitterTileSpriteSubmitterSpriteGPULayer,SubmitterTilemapGPULayer
Transformers (compute vertex positions):
TransformerImage,TransformerStamp,TransformerTile,TransformerTileSprite
Texturers (manage texture binding):
TexturerImage,TexturerTileSprite
Filters (post-processing -- see filters-and-postfx.md):
BaseFilter,BaseFilterShaderFilterBarrel,FilterBlend,FilterBlocky,FilterBlur(Low/Med/High variants)FilterBokeh,FilterColorMatrix,FilterCombineColorMatrixFilterDisplacement,FilterGlow,FilterGradientMap,FilterImageLightFilterKey,FilterMask,FilterNormalTools,FilterPanoramaBlurFilterParallelFilters,FilterPixelate,FilterQuantizeFilterSampler,FilterShadow,FilterThreshold,FilterVignette,FilterWipe
Other:
Camera,FillCamera,FillRect,FillPath,FillTriDrawLine,StrokePath,ShaderQuadListCompositor,RebindContext,YieldContextDynamicTextureHandler
Extending: Custom RenderNodes
// Register a custom node constructor:
renderer.renderNodes.addNodeConstructor('MyNode', MyNodeClass);// Or add a pre-built node instance:
renderer.renderNodes.addNode('MyNode', myNodeInstance);
New Game Objects
CaptureFrame
Captures the current framebuffer contents to a texture at the point in the display list where it sits. Does not render anything itself. WebGL only.
// Everything above this in the display list gets captured:
const image1 = this.add.image(400, 300, 'background');// Enable framebuffer usage on the camera:
this.cameras.main.setForceComposite(true);// Create the capture point:
const capture = this.add.captureFrame('myCapturedTexture');// Use the captured texture on another object:
const overlay = this.add.image(400, 300, 'myCapturedTexture');
// Add filters to the overlay to distort the captured scene
Key details:
- Requires
camera.setForceComposite(true)or a framebuffer context (Filters, DynamicTexture, camera with partial alpha) - Inside a Container with filters, captures only that Container's contents
- Setting
visible = falsestops capturing - Components: BlendMode, Depth, RenderNodes, Visible
Source: src/gameobjects/captureframe/CaptureFrame.js
Gradient
Displays GPU-rendered color gradients. Extends Shader. Supports linear, radial, and other shape modes with configurable ColorRamp containing ColorBand objects.
// Simple linear gradient:
const grad = this.add.gradient(undefined, 100, 100, 200, 200);// Complex radial gradient with multiple color bands:
const halo = this.add.gradient({
bands: [
{ start: 0.5, end: 0.6, colorStart: [0.5, 0.5, 1, 0], colorEnd: 0xffffff, colorSpace: 1, interpolation: 4 },
{ start: 0.6, end: 1, colorStart: 0xffffff, colorEnd: [1, 0.5, 0.5, 0], colorSpace: 1, interpolation: 3 }
],
dither: true,
repeatMode: 1,
shapeMode: 2, // radial
start: { x: 0.5, y: 0.5 },
shape: { x: 0.5, y: 0.0 }
}, 400, 300, 800, 800);// Animate:
halo.offset = 0.1 * (1 + Math.sin(time / 1000));
Key details:
- Config:
GradientQuadConfigwithbands,shapeMode,repeatMode,start,shape,dither - Colors defined via
ColorRampwithColorBandobjects (supports HSV, various interpolation modes) - Call
gradient.ramp.encode()after modifying ramp data at runtime
Source: src/gameobjects/gradient/Gradient.js
Noise Game Objects
All noise types extend Shader and are WebGL only. Six variants available:
// Basic white noise:
const noise = this.add.noise({
noiseOffset: [0, 0],
noisePower: 1
}, 100, 100, 256, 256);// Cellular noise with customization:
const cells = this.add.noiseCell2D({
noiseOffset: [0, 0],
noiseIterations: 3,
noiseNormalMap: true // output as normal map for lighting
}, 200, 200, 256, 256);// Simplex noise for natural effects:
const simplex = this.add.noiseSimplex2D({
noiseFlow: 0, // animate this for evolution
noiseIterations: 4,
noiseWarpAmount: 0.5, // turbulence
noiseSeed: 42,
noiseNormalMap: false
}, 300, 300, 256, 256);
Common properties across noise types:
noiseOffset--[x, y]array to scroll the patternnoisePower-- sculpt output levels (higher suppresses high values)noiseNormalMap-- output normal map (for lighting integration)noiseIterations-- detail level (cellular/simplex types)
Math equivalents: Phaser.Math.Hash(), Phaser.Math.HashCell(), Phaser.Math.HashSimplex()
Source: src/gameobjects/noise/
SpriteGPULayer
Renders very large numbers of quads (up to millions) in a single draw call by storing data in a static GPU buffer. Up to 100x faster than individual sprites. WebGL only.
const layer = this.add.spriteGPULayer(texture, size); // size = max number of members// Add members (do this all at once, not incrementally):
const member = { x: 100, y: 200, frame: 'tree', scaleX: 1, scaleY: 1, alpha: 1 };
layer.addMember(member);// Reuse the member object for efficiency with millions of entries:
member.x = 300;
member.y = 400;
member.frame = 'bush';
layer.addMember(member);// Enable lighting on the layer:
layer.setLighting(true);
Key details:
- Single texture only (no multi-atlas), single image per layer
- Members support tween-like animations (fade, bounce, wave, color shift) defined at creation
- Updating buffer contents is expensive -- populate once, leave unchanged
- Power-of-two textures recommended for pixel art to avoid seaming
- "Remove" members visually by setting
scaleX/scaleY/alphato 0 (avoids buffer rebuild) - Components: Alpha, BlendMode, Depth, ElapseTimer, Lighting, Mask, RenderNodes, TextureCrop, Visible
Source: src/gameobjects/spritegpulayer/SpriteGPULayer.js
New Components
Full component reference:
game-object-components.md
Lighting Component
Replaces the v3 approach of assigning a lighting pipeline. WebGL only.
// v3 approach:
sprite.setPipeline('Light2D');// v4 approach:
sprite.setLighting(true);// Self-shadowing (simulates surface shadows from texture brightness):
sprite.setSelfShadow(true, 0.5, 1/3);
// Args: enabled, penumbra (lower = sharper), diffuseFlatThreshold (0-1)// Use game-wide default for self-shadow:
sprite.setSelfShadow(null); // reads from config.render.selfShadow
Supported on: BitmapText, Blitter, Graphics, Shape, Image, Sprite, Particles, SpriteGPULayer, Stamp, Text, TileSprite, Video, TilemapLayer, TilemapGPULayer.
Batching note: Lighting changes the shader, which breaks batches. Group lit objects together and unlit objects together for best performance.
Source: src/gameobjects/components/Lighting.js
RenderSteps Component
Allows injecting custom logic into the render process of a game object. WebGL only. The Filters system uses RenderSteps internally.
// Add a custom render step:
gameObject.addRenderStep(function (renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
// Custom rendering logic here
// Call next step when ready:
var nextFn = gameObject._renderSteps[renderStep + 1];
if (nextFn) {
nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep + 1, displayList, displayListIndex);
}
});
Key details:
- Steps are stored in
_renderStepsarray, executed viarenderWebGLStep() - First step runs first and is responsible for calling subsequent steps
- This is how Filters defer and control the
renderWebGLflow
Source: src/gameobjects/components/RenderSteps.js
RenderNodes Component
Provides defaultRenderNodes, customRenderNodes, and renderNodeData maps on game objects. See the RenderNodes section above for usage.
Source: src/gameobjects/components/RenderNodes.js
TilemapGPULayer
Full tilemap reference:
tilemaps.md
High-performance GPU-based tilemap rendering. Renders the entire layer as a single quad via a specialized shader. WebGL only.
// Create via Tilemap with the gpu flag:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const gpuLayer = map.createLayer('Ground', tileset, 0, 0, true); // last arg: gpu = true
Capabilities:
- Single tileset with single texture image
- Maximum 4096x4096 tiles, up to 2^23 unique tile IDs
- Tile flipping and animation supported
- Orthographic tilemaps only (no isometric/hexagonal)
- Perfect texture filtering in LINEAR mode (no tile seams)
- Cost is per-pixel, not per-tile -- no performance loss with many visible tiles
Restrictions:
- Cannot use multiple tilesets
- Editing requires manual
generateLayerDataTexture()call to update - Orthographic only
Internal data: Tile data stored in a texture (4 bytes/tile: 2 flip bits, 1 animation bit, 1 unused, 28-bit tile index). Animation data in a separate texture.
Source: src/tilemaps/TilemapGPULayer.js
For detailed configuration options, API reference tables, and source file maps, see the reference guide.





首页
