В библиотеке PixiJS текстура может быть создана не только из изображений или спрайтов, но и непосредственно из массива пикселей. Такой подход полезен для генеративной графики, процедурных эффектов, фильтров и динамически изменяемых текстур.
Массив пикселей в PixiJS представляет собой
одномерный массив значений типа Uint8Array или
Uint8ClampedArray, где каждые четыре последовательных
элемента описывают один пиксель в формате RGBA:
R — красный канал (0–255)G — зелёный канал (0–255)B — синий канал (0–255)A — альфа-канал (0–255), 0 — полностью прозрачный, 255
— полностью непрозрачныйНапример, массив для одного красного пикселя будет выглядеть так:
const pixels = new Uint8Array([255, 0, 0, 255]);
Для изображения размером width × height длина массива
должна быть равна width * height * 4.
PIXI.Texture.fromBufferМетод PIXI.Texture.fromBuffer позволяет создать текстуру
напрямую из массива пикселей:
const width = 100;
const height = 100;
const pixels = new Uint8Array(width * height * 4);
// Заполнение массива случайными цветами
for (let i = 0; i < pixels.length; i += 4) {
pixels[i] = Math.random() * 255; // R
pixels[i + 1] = Math.random() * 255; // G
pixels[i + 2] = Math.random() * 255; // B
pixels[i + 3] = 255; // A
}
const texture = PIXI.Texture.fromBuffer(pixels, width, height);
const sprite = new PIXI.Sprite(texture);
app.stage.addChild(sprite);
Ключевые моменты:
pixels — одномерный массив пикселей в формате
RGBA.width и height определяют размеры
текстуры.PIXI.BaseTexture и PIXI.TextureДля более низкоуровневого контроля можно создавать текстуру через
PIXI.BaseTexture, передавая массив пикселей в
PIXI.Texture:
const baseTexture = new PIXI.BaseTexture(pixels, {
width: width,
height: height,
scaleMode: PIXI.SCALE_MODES.NEAREST
});
const texture = new PIXI.Texture(baseTexture);
const sprite = new PIXI.Sprite(texture);
Параметр scaleMode позволяет управлять
масштабированием текстуры:
PIXI.SCALE_MODES.NEAREST — резкое масштабирование
(пиксельный стиль)PIXI.SCALE_MODES.LINEAR — плавное сглаживаниеТекстуру, созданную из массива пикселей, можно обновлять динамически.
Для этого используется метод update у
BaseTexture:
function updateTexture(texture, newPixels) {
texture.update(newPixels);
}
// Пример динамической анимации
for (let i = 0; i < pixels.length; i += 4) {
pixels[i] = Math.random() * 255;
pixels[i + 1] = Math.random() * 255;
pixels[i + 2] = Math.random() * 255;
}
updateTexture(texture.baseTexture, pixels);
Такой подход позволяет создавать эффекты шума, огня, воды и других процедурных текстур без необходимости загружать изображения.
Массив пикселей можно формировать программно для создания градиентов:
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
const i = (y * width + x) * 4;
pixels[i] = (x / width) * 255; // R
pixels[i + 1] = (y / height) * 255; // G
pixels[i + 2] = 128; // B
pixels[i + 3] = 255; // A
}
}
Такой код создаст плавный переход красного и зелёного по горизонтали и вертикали.
Uint8Array предпочтительна для больших
текстур, так как использование обычного массива Array
значительно медленнее.scaleMode влияет на визуальное качество и скорость
рендеринга при масштабировании.width * height * 4.Создание текстуры из массива пикселей открывает мощные возможности генеративной графики в PixiJS, позволяя работать с динамическим содержимым без необходимости в сторонних изображениях. Такой подход идеально подходит для эффектов частиц, процедурных карт и интерактивных визуализаций.