Renderers

Live2D

Render 2D animated avatars using Live2D Cubism models with switchable WebGL / WebGPU backends.

The Live2DRenderer renders a Live2D Cubism model in the browser using @live2d-loader/core with pluggable rendering backends. It supports automatic blink, pointer tracking, expression presets, both RMS-based and viseme-based lip-sync, and switchable WebGL / WebGPU rendering.

Usage

import { Live2DRenderer } from "avatarlayer/renderers";

const renderer = new Live2DRenderer({
  modelUrl: "/models/avatar/model.model3.json", // Cubism 5
  frameMode: "upperBodyFocus",
  autoBlink: true,
  renderer: "webgpu", // use WebGPU for Cubism 3/4/5 models
});

Constructor options

OptionTypeDefaultDescription
modelUrlstringrequiredURL to a Live2D model descriptor (.model.json for Cubism 2, .model3.json for Cubism 3/4/5)
frameModeLive2DFrameMode"upperBodyFocus"Camera framing mode
autoBlinkbooleantrueEnable automatic blinking
autoTrackPointerbooleanfalseTrack mouse/touch pointer with eye gaze
visemeLipSyncbooleanfalseEnable viseme-based lip-sync instead of RMS amplitude
renderer'webgl' | 'webgpu''webgl'Rendering backend for Cubism 3/4/5 models. Falls back to WebGL automatically when WebGPU is unavailable.

Frame modes

ModeDescription
"upperBodyFocus"Camera frames the upper body and face
"fullBody"Full-body view with automatic foot-snap alignment

WebGL / WebGPU backends

The renderer automatically selects the appropriate backend based on the model type and renderer setting:

Model formatrenderer: 'webgl'renderer: 'webgpu'
.model.json (Cubism 2)WebGLWebGL (always — Cubism 2 SDK requires direct GL access)
.model3.json (Cubism 3/4/5)WebGLWebGPU (with automatic WebGL fallback)

How it works

When mounted, the renderer:

  1. Detects the Cubism version from the model URL extension
  2. Loads the appropriate Cubism adapter (Cubism2Adapter or Cubism5Adapter)
  3. Creates the rendering backend (WebGL or WebGPU) based on the model type and preference
  4. Loads the model via @live2d-loader/core
  5. Starts automatic blink and idle motion loops
  6. Begins a render loop at screen refresh rate

Peer dependencies

The Live2D renderer requires these packages to be installed:

  • @live2d-loader/core
  • @live2d-loader/renderer-webgl
  • @live2d-loader/adapter-cubism2 (for Cubism 2 models)
  • @live2d-loader/adapter-cubism5 (for Cubism 3/4/5 models)

When speak(audio) is called:

  1. The audio blob is played through an <audio> element
  2. Audio is analyzed in realtime for lip-sync — either via RMS amplitude or viseme weights
  3. The mouth parameters on the Live2D model are updated each frame
  4. The promise resolves when the audio ends

Avatar control

The Live2D renderer responds to update() calls for expression and emotion control:

session.updateControl({
  avatar: {
    emotion: {
      label: "happy",
      intensity: 0.8,
      valence: 0.7,
      arousal: 0.5,
    },
  },
});

Supported expressions are mapped automatically: happy, sad, angry, surprised, relaxed, neutral. The renderer matches available model expressions to the requested emotion.

Cubism version parameter mapping

The renderer automatically uses the correct parameter IDs for each Cubism version:

FeatureCubism 2 IDCubism 5 ID
Head yawPARAM_ANGLE_XParamAngleX
Head pitchPARAM_ANGLE_YParamAngleY
Head rollPARAM_ANGLE_ZParamAngleZ
Left eyePARAM_EYE_L_OPENParamEyeLOpen
Right eyePARAM_EYE_R_OPENParamEyeROpen
Eye ball XPARAM_EYE_BALL_XParamEyeBallX
Eye ball YPARAM_EYE_BALL_YParamEyeBallY
Mouth openPARAM_MOUTH_OPEN_YParamMouthOpenY
Mouth formPARAM_MOUTH_FORMParamMouthForm