RenderTexture в PixiJS представляет собой текстуру, на
которую можно рендерить любые объекты сцены вместо основного канваса.
Это позволяет создавать сложные эффекты постобработки, динамические
спрайты и оптимизировать отрисовку повторяющихся элементов. Создание
RenderTexture выполняется через метод
PIXI.RenderTexture.create(options), где
options задают ширину, высоту, формат пикселей и
фильтры.
const renderTexture = PIXI.RenderTexture.create({ width: 800, height: 600 });
После создания текстуры её можно использовать как обычный
PIXI.Sprite:
const sprite = new PIXI.Sprite(renderTexture);
app.stage.addChild(sprite);
Для рендеринга сцены или отдельного контейнера на
RenderTexture используется метод
renderer.render(displayObject, renderTexture). Это
позволяет захватывать состояние сцены в любой момент и работать с ним
как с изображением.
const container = new PIXI.Container();
container.addChild(new PIXI.Sprite.from("image.png"));
app.renderer.render(container, { renderTexture });
При необходимости можно задавать параметры трансформации, фильтры и очистку текстуры перед рендерингом:
app.renderer.render(container, {
renderTexture,
clear: true, // очищает текстуру перед рендерингом
transform: new PIXI.Matrix().translate(100, 50)
});
Одним из ключевых применений RenderTexture является
постобработка. Создавая промежуточные текстуры, можно
применять фильтры, изменять цвета, добавлять размытие и создавать
сложные визуальные эффекты без прямого вмешательства в основной
канвас.
Фильтры в PixiJS применяются к спрайтам, созданным на основе
RenderTexture. Это позволяет многократно использовать один
и тот же эффект на различных объектах.
const blurFilter = new PIXI.filters.BlurFilter();
sprite.filters = [blurFilter];
Для динамической постобработки часто создают два
RenderTexture и чередуют их, создавая эффект
ping-pong, например, для размытия в несколько
проходов:
const rt1 = PIXI.RenderTexture.create({ width: 800, height: 600 });
const rt2 = PIXI.RenderTexture.create({ width: 800, height: 600 });
let toggle = true;
app.ticker.add(() => {
const source = toggle ? rt1 : rt2;
const target = toggle ? rt2 : rt1;
app.renderer.render(sprite, { renderTexture: target, clear: true });
sprite.texture = target;
toggle = !toggle;
});
RenderTexture позволяет объединять несколько слоёв сцены
в один итоговый спрайт. Например, можно рендерить фон, персонажей и
эффекты на отдельные текстуры, а затем комбинировать их:
const backgroundRT = PIXI.RenderTexture.create({ width: 800, height: 600 });
const effectsRT = PIXI.RenderTexture.create({ width: 800, height: 600 });
app.renderer.render(backgroundContainer, { renderTexture: backgroundRT });
app.renderer.render(effectsContainer, { renderTexture: effectsRT });
const finalSprite = new PIXI.Sprite(backgroundRT);
finalSprite.addChild(new PIXI.Sprite(effectsRT));
app.stage.addChild(finalSprite);
Такой подход повышает производительность при сложных сценах, так как отдельные слои можно обновлять не каждый кадр, а только при изменении содержимого.
RenderTexture поддерживает автоматическое
масштабирование и обновление при изменении размеров сцены:
renderTexture.resize(newWidth, newHeight);
Это особенно полезно для эффектов, которые должны подстраиваться под размер окна или разрешение дисплея, например, для полноэкранного размытия или свечения.
renderer.render обходится дорого.clear — ненужное очищение увеличивает нагрузку на GPU.RenderTexture.const particlesContainer = new PIXI.Container();
// генерация частиц
const particleTexture = PIXI.RenderTexture.create({ width: 800, height: 600 });
app.ticker.add(() => {
app.renderer.render(particlesContainer, { renderTexture: particleTexture, clear: true });
glowSprite.texture = particleTexture;
});
GlowFilter к спрайту текстуры.const glowFilter = new PIXI.filters.GlowFilter({ distance: 15, outerStrength: 2 });
characterSprite.filters = [glowFilter];
const characterRT = PIXI.RenderTexture.create({ width: 200, height: 200 });
app.renderer.render(characterContainer, { renderTexture: characterRT });
PIXI.RenderTexture.create({ width, height })renderer.render(displayObject, { renderTexture, clear, transform })Spritesprite.filters = [filter]RenderTexture открывает возможность создания мощных
визуальных эффектов и сложных сцен, одновременно повышая
производительность и позволяя гибко управлять слоями и фильтрами.