WebGL and WebGPU rendering backends, batching system, geometry management, shaders, and performance optimization utilities. The rendering system provides the foundation for high-performance graphics rendering with multiple backend support.
Core renderer classes supporting different graphics APIs.
/**
* WebGL renderer implementation
*/
class WebGLRenderer extends AbstractRenderer {
constructor(options?: WebGLRendererOptions);
/** WebGL rendering context */
readonly gl: WebGLRenderingContext | WebGL2RenderingContext;
/** WebGL context system */
context: GlContextSystem;
/** Shader system */
shader: GlShaderSystem;
/** Geometry system */
geometry: GlGeometrySystem;
/** Buffer system */
buffer: GlBufferSystem;
/** Texture system */
texture: GlTextureSystem;
/** State system */
state: GlStateSystem;
/**
* Render display object
* @param displayObject - Object to render
* @param options - Render options
*/
render(displayObject: Container, options?: RenderOptions): void;
}
/**
* WebGPU renderer implementation
*/
class WebGPURenderer extends AbstractRenderer {
constructor(options?: WebGPURendererOptions);
/** WebGPU device */
readonly device: GPUDevice;
/** WebGPU adapter */
readonly adapter: GPUAdapter;
/** Pipeline system */
pipeline: PipelineSystem;
/** Bind group system */
bindGroup: BindGroupSystem;
/** GPU buffer system */
buffer: GpuBufferSystem;
/** GPU texture system */
texture: GpuTextureSystem;
/**
* Render display object
* @param displayObject - Object to render
* @param options - Render options
*/
render(displayObject: Container, options?: RenderOptions): void;
}
/**
* Base renderer class
*/
abstract class AbstractRenderer extends EventEmitter {
constructor(options?: RendererOptions);
/** Renderer type */
readonly type: RENDERER_TYPE;
/** Canvas element */
readonly canvas: HTMLCanvasElement;
/** Screen rectangle */
readonly screen: Rectangle;
/** Rendering resolution */
resolution: number;
/** Auto resize flag */
autoDensity: boolean;
/** Background system */
background: BackgroundSystem;
/** View system */
view: ViewSystem;
/** Render target system */
renderTarget: RenderTargetSystem;
/** Global uniform system */
globalUniforms: GlobalUniformSystem;
/**
* Resize renderer
* @param width - New width
* @param height - New height
* @param resolution - New resolution
*/
resize(width: number, height: number, resolution?: number): void;
/**
* Clear renderer
* @param color - Clear color
* @param alpha - Clear alpha
*/
clear(color?: ColorSource, alpha?: number): void;
/**
* Destroy renderer
* @param removeView - Remove canvas from DOM
*/
destroy(removeView?: boolean): void;
}
/**
* Auto-detect best renderer
* @param options - Renderer options
* @returns Promise resolving to renderer
*/
function autoDetectRenderer<T extends AbstractRenderer>(options?: RendererOptions): Promise<T>;
interface RendererOptions {
/** Canvas width */
width?: number;
/** Canvas height */
height?: number;
/** Canvas element */
canvas?: HTMLCanvasElement;
/** Background color */
background?: ColorSource;
/** Background alpha */
backgroundAlpha?: number;
/** Device pixel ratio */
resolution?: number;
/** Auto adjust for device pixel ratio */
autoDensity?: boolean;
/** Antialias */
antialias?: boolean;
/** Premultiplied alpha */
premultipliedAlpha?: boolean;
/** Preserve drawing buffer */
preserveDrawingBuffer?: boolean;
/** Power preference */
powerPreference?: WebGLPowerPreference;
/** WebGL context attributes */
context?: WebGLContextAttributes;
/** Preferred renderer */
preference?: 'webgl' | 'webgpu';
/** Hello message */
hello?: boolean;
}High-performance batching system for efficient rendering.
/**
* Batch rendering system
*/
class Batcher {
constructor();
/** Maximum textures per batch */
maxTextures: number;
/** Current batch size */
size: number;
/** Attribute buffer */
attributeBuffer: ViewableBuffer;
/** Index buffer */
indexBuffer: Uint16Array | Uint32Array;
/**
* Add object to batch
* @param batchableObject - Object to batch
*/
addToBatch(batchableObject: Batchable): void;
/**
* Break current batch
* @param instructionSet - Instruction set
*/
break(instructionSet: InstructionSet): void;
/**
* Finish batch
* @param instructionSet - Instruction set
*/
finish(instructionSet: InstructionSet): void;
/**
* Upload batch data
* @param instructionSet - Instruction set
*/
upload(instructionSet: InstructionSet): void;
/**
* Execute batch
* @param instructionSet - Instruction set
*/
execute(instructionSet: InstructionSet): void;
}
/**
* Batchable object interface
*/
interface Batchable {
/** Batch size */
batchSize: number;
/** Attribute size */
attributeSize: number;
/** Index size */
indexSize: number;
/** Texture */
texture: Texture;
/** Blend mode */
blendMode: BLEND_MODES;
/**
* Pack attributes
* @param float32View - Float32 view
* @param uint32View - Uint32 view
* @param index - Starting index
* @param textureId - Texture ID
*/
packAttributes(float32View: Float32Array, uint32View: Uint32Array, index: number, textureId: number): void;
/**
* Pack indices
* @param indexBuffer - Index buffer
* @param index - Starting index
* @param indicesOffset - Vertex offset
*/
packIndex(indexBuffer: Uint16Array | Uint32Array, index: number, indicesOffset: number): void;
}Vertex data management and geometry utilities.
/**
* Geometry class for vertex data
*/
class Geometry {
constructor(options?: GeometryOptions);
/** Vertex attributes */
attributes: Record<string, Attribute>;
/** Index buffer */
indexBuffer: Buffer;
/** Instance count */
instanceCount: number;
/** Geometry bounds */
bounds: Bounds;
/**
* Add attribute
* @param name - Attribute name
* @param buffer - Attribute buffer
* @param size - Components per vertex
* @param normalized - Normalize values
* @param type - Data type
* @param stride - Byte stride
* @param offset - Byte offset
* @returns This geometry
*/
addAttribute(name: string, buffer: Buffer | number[], size?: number, normalized?: boolean, type?: TYPES, stride?: number, offset?: number): this;
/**
* Add index buffer
* @param buffer - Index buffer
* @returns This geometry
*/
addIndex(buffer: Buffer | number[]): this;
/**
* Get attribute
* @param name - Attribute name
* @returns Attribute data
*/
getAttribute(name: string): Attribute;
/**
* Get bounds
* @param out - Rectangle to store bounds
* @returns Geometry bounds
*/
getBounds(out?: Rectangle): Rectangle;
/**
* Dispose geometry
*/
dispose(): void;
/**
* Clone geometry
* @returns Cloned geometry
*/
clone(): Geometry;
}
/**
* Vertex attribute definition
*/
interface Attribute {
/** Attribute buffer */
buffer: Buffer;
/** Components per vertex */
size: number;
/** Normalize values */
normalized: boolean;
/** Data type */
type: TYPES;
/** Byte stride */
stride: number;
/** Byte offset */
offset: number;
}GPU buffer management for vertex and index data.
/**
* GPU buffer for vertex/index data
*/
class Buffer {
constructor(data?: ArrayBuffer | ArrayBufferView, usage?: BUFFER_USAGE, index?: boolean);
/** Buffer data */
data: ArrayBuffer | ArrayBufferView;
/** Buffer usage pattern */
usage: BUFFER_USAGE;
/** Is index buffer */
index: boolean;
/** Buffer size */
size: number;
/** Update ID */
updateId: number;
/**
* Update buffer data
* @param data - New buffer data
*/
update(data?: ArrayBuffer | ArrayBufferView): void;
/**
* Dispose buffer
*/
dispose(): void;
/**
* Create buffer from array
* @param data - Array data
* @param usage - Buffer usage
* @param index - Is index buffer
* @returns New buffer
*/
static from(data: number[], usage?: BUFFER_USAGE, index?: boolean): Buffer;
}
/**
* Buffer usage patterns
*/
enum BUFFER_USAGE {
STATIC = 0,
DYNAMIC = 1,
STREAM = 2
}Shader compilation and management.
/**
* Shader program
*/
class Shader {
constructor(options?: ShaderOptions);
/** Vertex shader source */
vertex: string;
/** Fragment shader source */
fragment: string;
/** Uniform groups */
groups: Record<string, UniformGroup>;
/** Shader resources */
resources: Record<string, any>;
/**
* Destroy shader
*/
destroy(): void;
/**
* Create shader from sources
* @param vertex - Vertex shader source
* @param fragment - Fragment shader source
* @param name - Shader name
* @returns New shader
*/
static from(vertex: string, fragment: string, name?: string): Shader;
}
/**
* Uniform group for shader uniforms
*/
class UniformGroup {
constructor(uniforms: Record<string, any>, options?: UniformGroupOptions);
/** Uniform values */
uniforms: Record<string, any>;
/** Update ID */
updateId: number;
/** Static flag */
isStatic: boolean;
/**
* Update uniform values
* @param uniforms - New uniform values
*/
update(uniforms?: Record<string, any>): void;
}Render target and framebuffer management.
/**
* Render target for off-screen rendering
*/
class RenderTarget {
constructor(options?: RenderTargetOptions);
/** Color textures */
colorTextures: Texture[];
/** Depth/stencil texture */
depthStencilTexture: Texture;
/** Render target size */
size: { width: number; height: number };
/** Resolution */
resolution: number;
/** Multisample count */
multisample: MSAA_QUALITY;
/**
* Resize render target
* @param width - New width
* @param height - New height
* @param resolution - New resolution
*/
resize(width: number, height: number, resolution?: number): void;
/**
* Destroy render target
*/
destroy(): void;
}
interface RenderTargetOptions {
/** Width */
width?: number;
/** Height */
height?: number;
/** Resolution */
resolution?: number;
/** Color texture count */
colorTextures?: number;
/** Enable depth buffer */
depth?: boolean;
/** Enable stencil buffer */
stencil?: boolean;
/** Multisample quality */
antialias?: MSAA_QUALITY;
}Performance monitoring and optimization utilities.
/**
* Performance monitoring
*/
interface PerformanceData {
/** Frame rate */
fps: number;
/** Frame time in milliseconds */
frameTime: number;
/** Draw calls per frame */
drawCalls: number;
/** Texture binds per frame */
textureBinds: number;
/** Vertices rendered */
vertices: number;
/** Memory usage */
memory: {
/** Texture memory */
textures: number;
/** Buffer memory */
buffers: number;
/** Total GPU memory */
total: number;
};
}
/**
* Get performance statistics
* @param renderer - Renderer instance
* @returns Performance data
*/
function getPerformanceStats(renderer: AbstractRenderer): PerformanceData;
/**
* Optimize renderer for performance
* @param renderer - Renderer instance
* @param options - Optimization options
*/
function optimizeRenderer(renderer: AbstractRenderer, options?: OptimizationOptions): void;
interface OptimizationOptions {
/** Enable batching */
batching?: boolean;
/** Texture garbage collection */
textureGC?: boolean;
/** Geometry pooling */
geometryPooling?: boolean;
/** Cull off-screen objects */
culling?: boolean;
}Usage Examples:
import {
autoDetectRenderer,
WebGLRenderer,
WebGPURenderer,
Geometry,
Buffer,
Shader,
RenderTarget,
BUFFER_USAGE
} from 'pixi.js';
// Renderer creation and setup
const renderer = await autoDetectRenderer({
width: 1024,
height: 768,
preference: 'webgpu',
antialias: true,
resolution: window.devicePixelRatio
});
document.body.appendChild(renderer.canvas);
// Manual renderer creation
const webglRenderer = new WebGLRenderer({
width: 800,
height: 600,
powerPreference: 'high-performance'
});
// Custom geometry creation
const geometry = new Geometry();
// Vertex positions (triangle)
const positions = new Float32Array([
0, 50, // Top vertex
-50, -50, // Bottom left
50, -50 // Bottom right
]);
geometry.addAttribute('aPosition', new Buffer(positions), 2);
// Index buffer
const indices = new Uint16Array([0, 1, 2]);
geometry.addIndex(new Buffer(indices, BUFFER_USAGE.STATIC, true));
// Custom shader
const shader = Shader.from(`
attribute vec2 aPosition;
uniform mat3 uProjectionMatrix;
uniform mat3 uWorldTransformMatrix;
void main() {
gl_Position = vec4((uProjectionMatrix * uWorldTransformMatrix * vec3(aPosition, 1.0)).xy, 0.0, 1.0);
}
`, `
uniform vec4 uColor;
void main() {
gl_FragColor = uColor;
}
`);
// Render target for off-screen rendering
const renderTexture = RenderTarget.create({
width: 512,
height: 512,
multisample: 4 // 4x MSAA
});
// Render scene to texture
renderer.render({
container: scene,
target: renderTexture
});
// Performance monitoring
const stats = getPerformanceStats(renderer);
console.log(`FPS: ${stats.fps}, Draw Calls: ${stats.drawCalls}`);
// Batch optimization
const batcher = renderer.batcher;
batcher.maxTextures = 16; // Increase batch size
// Memory management
renderer.texture.gc(); // Clean up unused textures
renderer.buffer.gc(); // Clean up unused buffers
// Conditional rendering based on capabilities
if (renderer.type === RENDERER_TYPE.WEBGL) {
const glRenderer = renderer as WebGLRenderer;
console.log('WebGL version:', glRenderer.context.webGLVersion);
// WebGL-specific optimizations
glRenderer.state.setState({
culling: true,
clockwiseFrontFace: false,
depthTest: true
});
}
// High-performance particle rendering
const particleGeometry = new Geometry();
const particleCount = 10000;
// Create instanced attributes
const positions = new Float32Array(particleCount * 2);
const colors = new Float32Array(particleCount * 4);
const scales = new Float32Array(particleCount);
for (let i = 0; i < particleCount; i++) {
const i2 = i * 2;
const i4 = i * 4;
positions[i2] = Math.random() * 800;
positions[i2 + 1] = Math.random() * 600;
colors[i4] = Math.random();
colors[i4 + 1] = Math.random();
colors[i4 + 2] = Math.random();
colors[i4 + 3] = 1.0;
scales[i] = 0.5 + Math.random() * 1.5;
}
particleGeometry.addAttribute('aInstancePosition', positions, 2);
particleGeometry.addAttribute('aInstanceColor', colors, 4);
particleGeometry.addAttribute('aInstanceScale', scales, 1);
// Clean up resources
geometry.dispose();
shader.destroy();
renderTexture.destroy();
renderer.destroy(true);