Phaser использует модульную систему рендеринга, построенную на основе Pipeline. Pipeline — это последовательность шагов, через которые проходят графические объекты для отрисовки на экране. Основная задача Pipeline — управлять рендерингом спрайтов, текстур, шейдеров и других графических элементов с максимальной производительностью.
В Phaser 3 существует несколько встроенных типов Pipeline:
Каждый Pipeline реализует методы жизненного цикла:
onBind, onDraw, onEnd, позволяя
оптимизировать работу GPU и контролировать порядок отрисовки.
Любой объект сцены Phaser (спрайт, тайл, текст) имеет свойство
pipeline, которое определяет, через какой рендеринг
проходить:
sprite.setPipeline('Light2D');
Это позволяет комбинировать разные эффекты и шейдеры. Если не указывать свой Pipeline, объект использует DefaultPipeline, оптимизированный для стандартной 2D-графики.
Pipeline работает с WebGL Shaders, где каждый этап может изменять цвет, прозрачность или координаты пикселей. Phaser управляет передачей текстур и атрибутов вершин, чтобы разработчику не приходилось вручную писать сложные WebGL-шейдеры.
class MyCustomPipeline extends Phaser.Renderer.WebGL.Pipelines.SinglePipeline {
constructor(game) {
super({
game: game,
fragShader: `
precision mediump float;
uniform sampler2D uMainSampler;
varying vec2 outTexCoord;
void main(void) {
vec4 color = texture2D(uMainSampler, outTexCoord);
gl_FragColor = vec4(1.0 - color.rgb, color.a);
}
`
});
}
}
game.renderer.addPipeline('invert', new MyCustomPipeline(game));
sprite.setPipeline('invert');
Это позволит объекту проходить через кастомный шейдер, в данном случае инвертирующий цвета.
Pipeline может принимать uniform-переменные, позволяя динамически изменять визуальные эффекты:
this.customPipeline.setFloat1('uIntensity', 0.5);
Это делает Pipeline мощным инструментом для анимации, постобработки и сложных визуальных эффектов.
Phaser позволяет использовать несколько Pipeline на одной сцене, но каждый GameObject может проходить через один Pipeline одновременно. Для комплексных эффектов создаются Render Textures:
let rt = this.add.renderTexture(0, 0, 800, 600);
rt.draw(sprite);
rt.setPipeline('Light2D');
RenderTexture собирает несколько объектов в одно изображение, после чего можно применять шейдерные эффекты ко всему слою сразу.
update.Pipeline Phaser интегрирован с системой камер, масок и световых эффектов, обеспечивая гибкий и производительный рендеринг. Он является ключевым компонентом для создания сложной графики и визуальных эффектов в играх на JavaScript.
Использование Pipeline открывает доступ к низкоуровневому управлению графикой без необходимости писать полноценный WebGL-код с нуля.