XGRIDSDocumentazione
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Serie Lixel PortalCam

    • PortalCam P1

      • Panoramica del prodotto
      • Operazioni di base
      • Uso della LCC Scan App
      • Manutenzione e cura
      • FAQ
  • Serie Lixel K

    • Lixel K1

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione del dispositivo
      • Flusso di scansione
      • Ottenere una nuvola di punti con coordinate assolute
      • Fusione delle mappe
      • Consigli di pianificazione dei percorsi per scene tipiche
      • Precauzioni
      • FAQ
    • Lixel K2

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione
      • Flusso di scansione
      • Acquisire una nuvola di punti con coordinate assolute
      • Fusione mappe
      • Consigli di pianificazione dei percorsi per scene tipiche
      • Precauzioni
      • FAQ
  • Serie Lixel L

    • Lixel L2 Pro

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione del dispositivo
      • Flusso di scansione
      • Ottenere una nuvola di punti con coordinate assolute
      • Punto di misura
      • Appendice
      • FAQ
    • Lixel L3

      • Panoramica del prodotto
      • Operazioni di base
      • Attivazione e connessione del dispositivo
      • Acquisizione dei dati
      • Acquisizione di coordinate assolute
      • Appendice
  • Lixel Studio

    • Versione e copyright
    • Installazione e attivazione
    • Interfaccia del software
    • Operazioni sui file
    • Elaborazione del progetto
    • Strumenti
    • Disegno 2D
    • Applicazioni di settore
    • Impostazioni
    • Connessione del dispositivo
    • Domande Frequenti
  • Lixel CyberColor

    • LCC Studio

      • Introduzione
      • Versione e aggiornamenti
      • Download e installazione
      • Panoramica dell'interfaccia e navigazione
      • Operazioni preliminari alla ricostruzione
      • Prima della ricostruzione
      • Ricostruzione del modello
      • Ricostruzione modello singolo
      • Fusione delle mappe
      • Fusione aria-terra
      • Ricostruzione aerea
      • I miei modelli
      • Altre funzioni
      • Impostazioni e account
      • Convertitore
      • Ricostruzione video
      • Domande Frequenti / FAQ
    • LCC Scene Editor

      • Versione e aggiornamenti
      • Account e accesso
      • Panoramica del prodotto e home page
      • Interfaccia dell'editor
      • Modalità di navigazione
      • File
      • Impostazioni
      • Modifica
      • Finestra
      • Barra degli strumenti globale
      • Asset e proprietà
      • Barra degli strumenti sinistra
      • Punti di vista
      • Portale
      • Skybox
      • Annotazioni
      • Misurazione
      • Flythrough
      • Rapporto scena
      • 3D Layout
      • Mini-mappa
      • Modalità Anteprima (Viewer)
      • Aiuto
      • Domande frequenti (FAQ)
      • Punto di spawn
    • LCC Model Editor

      • Versione e aggiornamenti
      • Guida utente
      • Panoramica e interfaccia
      • Operazioni sui file
      • Selettori
      • Modifica dei modelli
      • Misurazione
      • Correzione colore
      • Gestione degli asset
      • Impostazioni e Aiuto
      • Domande frequenti
    • Capture Guide

      • Panoramica
      • Panoramica dei dispositivi di acquisizione
      • Principi generali di acquisizione
      • Acquisizione di scene interne
      • Acquisizione di scene esterne
      • Acquisizione su larga scala (map fusion)
      • Acquisizione per aerial-ground map fusion
      • Acquisizione di oggetti
      • Acquisizione di persone
      • Acquisizione per ricostruzione da video
      • HD Enhancement
      • Control points (Lixel P1)
      • FAQ e risoluzione dei problemi
    • Buone Pratiche

      • Unione di più modelli 3DGS di grandi dimensioni
    • Cronologia versioni
  • Plugin e SDK

    • Unreal

      • Introduzione
      • Avvio rapido - Windows
      • Avvio rapido - Linux
      • Avvio rapido - Quest3
      • Edizioni e licenze
      • Rendering
      • Rasterizzazione Tiled (sperimentale)
      • Impostazioni visive
      • Normali e illuminazione
      • Modifica della scena
      • Parametri di prestazione
      • Guida alle prestazioni
      • Integrazione con plugin di terze parti e del motore
      • Proxy Mesh
      • Animazione di caricamento
      • Collisioni
      • Supporto del Navigation System
      • Supporto di Single Layer Water
      • Localizzazione
      • FAQ
      • Risoluzione dei problemi
      • Log e diagnostica
      • Contattaci
      • Buone pratiche

        • Rilluminare il 3DGS con una mesh di LixelStudio
        • Rendering indipendente per camera
      • Riferimento API

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • Actor SOG / SPZ / PLY
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enum
        • Struct
      • Registro delle modifiche

        • v3.5.0
        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Introduzione all'Unity SDK
      • Caratteristiche tecniche
      • Requisiti dell'ambiente di sviluppo
      • Guida rapida per PC
      • Guida all'ottimizzazione delle impostazioni di progetto
      • Guida allo sviluppo per Pico 4 Ultra
      • Guida allo streaming PC per Pico 4 Ultra
      • Guida allo sviluppo per Quest 3
      • Guida allo streaming PC per Quest 3
      • Guida allo sviluppo OpenXR
      • Guida allo streaming Business per Pico 4 Ultra
      • Glossario
      • FAQ
      • Contattaci
      • Guida allo sviluppo delle funzionalità

        • Guida allo sviluppo del rendering misto multi-scena
        • Guida allo sviluppo della ricezione delle ombre
        • Guida allo sviluppo dell'illuminazione in tempo reale
        • Guida allo sviluppo del rendering multi-camera
        • Guida allo sviluppo del rendering di immagini ad alta risoluzione
        • Guida allo sviluppo della compatibilità dei formati dati LCC e LCC2
        • Guida allo sviluppo dell'effetto di caricamento
        • Guida allo sviluppo del cambio di modalità di rendering Mip
        • Guida allo sviluppo dello snap a bordi e angoli
        • Guida allo sviluppo della decal proiettata
        • Guida allo sviluppo della decal proiettata video
        • Guida allo sviluppo dell'evidenziazione
        • Guida allo sviluppo del ritaglio in tempo reale
        • Guida allo sviluppo della regolazione del tono
        • Guida allo sviluppo dell'ottenimento dei dati Mesh della scena
        • Guida allo sviluppo della modalità Editor
        • Guida alla configurazione dei parametri di prestazioni di rendering
        • Guida allo sviluppo del co-impacchettamento di applicazione e dati
        • Guida allo sviluppo del sistema di collisione
        • Guida ai problemi di autorizzazione nello sviluppo su macOS
        • Guida allo sviluppo di compilazione e packaging per dispositivi iOS
      • Riferimento API

        • LCCManager
        • Renderer
        • Tipi di dati
      • Registro delle modifiche

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
    • Web

      • Introduzione
      • Guida all'ottimizzazione delle prestazioni di rendering
      • Configurazione grafica
      • Guida allo sviluppo con WebGPU
      • Domande frequenti
      • Riferimento API

        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setClipPrism
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setMipFilter
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
      • Registro delle modifiche

        • v0.6.4
        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0
  • API

    • Modellazione spaziale strutturata

      • Guida all'accesso
      • Flusso di modellazione
      • Riferimento API
      • Credenziali di caricamento temporanee
      • Codici di errore

Guida allo sviluppo con WebGPU

Questa guida spiega come utilizzare WebGPU per eseguire il rendering di scene 3DGS nel tuo progetto e quali sono le differenze rispetto all'integrazione con WebGL.

Supporto motore

La pipeline WebGPU supporta solo il motore Three.js. CesiumJS non supporta il rendering WebGPU.

Requisito di versione

Versione dell'SDK: SDK v0.6.4+

Limitazioni sul formato dei dati

Attualmente la pipeline WebGPU supporta solo il formato .lcc2. Il formato .lcc non supporta ancora il rendering WebGPU; il supporto verrà aggiunto nelle prossime versioni.

Se viene fornito un percorso dati .lcc, è necessario ripiegare sul renderer WebGL. Il codice di esempio implementa questa logica tramite il parametro forceWebGL:

const forceWebGL = new URL(dataPath, location.origin).pathname.endsWith('.lcc');
const renderer = await createRenderer(canvas, forceWebGL);

Limitazioni di WebXR

Attualmente l'SDK supporta WebXR solo nella pipeline WebGL. La pipeline WebGPU non supporta WebXR.

Limitazioni sui dispositivi mobili

WebGPU non è consigliato sui dispositivi mobili. Attualmente la pipeline WebGL dell'SDK offre prestazioni migliori su mobile.

Percorsi di rendering di Three.js

Three.js dispone di tre percorsi di rendering. Comprenderne le differenze è fondamentale per integrare correttamente l'SDK.

Percorso 1: WebGLRenderer classico (ampiamente utilizzato)

WebGLRenderer è il renderer principale fin dalla nascita di Three.js e rimane la scelta più diffusa. È costruito direttamente sull'API WebGL 2 e il suo sistema di materiali utilizza shader GLSL.

Importazione:

import * as THREE from 'three';
const renderer = new THREE.WebGLRenderer();

L'SDK supporta questo percorso, con entrambi i formati .lcc e .lcc2.

Percorso 2: Nuova architettura WebGPURenderer + backend WebGPU

WebGPURenderer è il renderer di nuova generazione di Three.js e si basa su una nuova architettura di backend astratta. Introduce un sistema di materiali basato su nodi (Node Material) e TSL (Three.js Shading Language). Gli shader scritti in TSL vengono compilati automaticamente in WGSL o GLSL a seconda del backend. Quando il browser supporta WebGPU, WebGPURenderer utilizza il backend WebGPU nativo.

Importazione:

import * as THREE from 'three';
import * as THREE_WEBGPU from 'three/webgpu';
import * as THREE_TSL from 'three/tsl';

const renderer = new THREE_WEBGPU.WebGPURenderer({ canvas });
await renderer.init();

L'SDK supporta questo percorso, solo con il formato .lcc2.

Percorso 3: Nuova architettura WebGPURenderer + backend WebGL 2

WebGPURenderer include un backend WebGL 2 integrato come fallback. Quando il browser non supporta WebGPU, WebGPURenderer passa automaticamente al backend WebGL 2. Pur utilizzando ancora WebGL 2, il sistema di materiali e la pipeline degli shader sono gli stessi del percorso 2 (Node Material + TSL), con GLSL come destinazione finale della compilazione.

L'SDK non supporta questo percorso.

Confronto tra i percorsi

PercorsoRendererAPI graficaSistema di materiali / shaderSupporto SDKFormati supportati
1. WebGL classicoWebGLRendererWebGL 2GLSL (ShaderMaterial)✅.lcc .lcc2
2. Nuova architettura WebGPUWebGPURendererWebGPUNode Material / TSL / WGSL✅.lcc2
3. Nuova architettura con fallback WebGLWebGPURendererWebGL 2 (fallback del backend)Node Material / TSL / GLSL❌-

Differenze tra l'integrazione WebGPU e WebGL

Rispetto all'integrazione con WebGL, le modifiche per WebGPU si concentrano nei punti seguenti. Il resto del codice applicativo (controllo della fotocamera, parametri delle prestazioni, ciclo di rendering, ecc.) rimane identico.

1. Importazioni aggiuntive: three/webgpu e three/tsl

WebGL richiede solo three. WebGPU richiede due moduli aggiuntivi:

<!-- importmap -->
<script type="importmap">
{
    "imports": {
        "three": "./engine/three/three.module.js",
        "three/webgpu": "./engine/three/three.webgpu.js",
        "three/tsl": "./engine/three/three.tsl.js",
        "three/addons/": "./engine/three/jsm/"
    }
}
</script>
import * as THREE from 'three';
import * as THREE_WEBGPU from 'three/webgpu';
import * as THREE_TSL from 'three/tsl';

2. Creazione asincrona del renderer

Il renderer WebGL viene creato in modo sincrono. Il renderer WebGPU richiede un'inizializzazione asincrona:

// WebGL (sincrono)
const renderer = new THREE.WebGLRenderer({ canvas, antialias: false });

// WebGPU (asincrono)
const renderer = new THREE_WEBGPU.WebGPURenderer({ canvas, antialias: false });
await renderer.init();

Si consiglia di utilizzare la funzione di utilità createRenderer fornita negli esempi dell'SDK, che implementa una catena di fallback completa:

  1. Il browser non supporta navigator.gpu → fallback su WebGLRenderer
  2. Impossibile ottenere l'adattatore GPU → fallback su WebGLRenderer
  3. Dopo l'inizializzazione WebGPURenderer ripiega silenziosamente sul backend WebGL 2 (nessun GPUDevice) → distruggerlo e fare fallback su WebGLRenderer
  4. Tutti i controlli superati → restituire un vero renderer WebGPU
import { createRenderer } from './engine/three/util.js';

const renderer = await createRenderer(canvas, forceWebGL);
const isWebGPU = renderer.isWebGPURenderer === true;

3. Disattivare l'output sRGB e il tone mapping

In modalità WebGPU è necessario disattivare la conversione di output sRGB predefinita e il tone mapping di Three.js. L'output sRGB predefinito aggiunge un passaggio di conversione lineare → sRGB aggiuntivo che entra in conflitto con il blending ad alpha premoltiplicato di 3DGS, causando colori non accurati:

if (isWebGPU) {
    renderer.outputColorSpace = THREE.LinearSRGBColorSpace;
    renderer.toneMapping = THREE.NoToneMapping;
}

In modalità WebGL non è necessario.

4. Parametri di LCCRender.load

WebGPU richiede i parametri aggiuntivi renderLibWebgpu e renderLibTSL:

// WebGL
LCCRender.load({
    camera, scene, renderer,
    dataPath,
    renderLib: THREE,
    canvas: renderer.domElement,
    // ...
});

// WebGPU
LCCRender.load({
    camera, scene, renderer,
    dataPath,
    renderLib: THREE,
    renderLibWebgpu: THREE_WEBGPU,  // nuovo
    renderLibTSL: THREE_TSL,        // nuovo
    canvas: renderer.domElement,
    // ...
});

Configurazione dei limiti del dispositivo GPU

Quando si crea un WebGPURenderer, si consiglia di interrogare i limiti effettivi dell'adattatore GPU e passarli in requiredLimits per sfruttare appieno le capacità del dispositivo:

const adapter = await navigator.gpu.requestAdapter();
const requiredLimits = {
    maxBufferSize: adapter.limits.maxBufferSize,
    maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,
    maxTextureDimension2D: adapter.limits.maxTextureDimension2D
};

const renderer = new THREE_WEBGPU.WebGPURenderer({
    canvas,
    antialias: false,
    requiredLimits
});
await renderer.init();

Esempio completo WebGPU

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>LCC Three.js WebGPU Demo</title>
    <style>
        html, body { margin: 0; padding: 0; height: 100%; overflow: hidden; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script type="importmap">
    {
        "imports": {
            "three": "./engine/three/three.module.js",
            "three/webgpu": "./engine/three/three.webgpu.js",
            "three/tsl": "./engine/three/three.tsl.js",
            "three/addons/": "./engine/three/jsm/"
        }
    }
    </script>
    <script type="module">
        import * as THREE from 'three';
        import * as THREE_WEBGPU from 'three/webgpu';
        import * as THREE_TSL from 'three/tsl';
        import { createRenderer } from './engine/three/util.js';
        import { LCCRender } from '../sdk/lcc-sdk-three.js';

        const dataPath = 'https://your-server.com/assets/scene/meta.lcc2';

        // WebGPU supporta solo .lcc2; per i dati .lcc forzare WebGL
        const forceWebGL = new URL(dataPath, location.origin).pathname.endsWith('.lcc');

        const scene = new THREE.Scene();
        const canvas = document.createElement('canvas');
        document.body.appendChild(canvas);

        // Creare il renderer con fallback automatico WebGPU → WebGL
        const renderer = await createRenderer(canvas, forceWebGL);
        const isWebGPU = renderer.isWebGPURenderer === true;
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setClearColor(0x000000);

        // Disattivare l'output sRGB in WebGPU per evitare conflitti di spazio colore con 3DGS
        if (isWebGPU) {
            renderer.outputColorSpace = THREE.LinearSRGBColorSpace;
            renderer.toneMapping = THREE.NoToneMapping;
        }

        const camera = new THREE.PerspectiveCamera(
            45, window.innerWidth / window.innerHeight, 0.1, 150000
        );
        camera.position.set(0, 2, 0);

        // Caricare la scena 3DGS
        const lccObj = LCCRender.load({
            camera, scene, renderer,
            dataPath,
            renderLib: THREE,
            renderLibWebgpu: THREE_WEBGPU,
            renderLibTSL: THREE_TSL,
            canvas: renderer.domElement,
            useEnv: true,
            useIndexDB: true,
            useLoadingEffect: true,
            appKey: null  // sostituire con la propria chiave
          },
          (mesh) => { console.log('Loaded', mesh); },
          (percent) => { console.log('Loading ' + (percent * 100).toFixed(1) + '%'); },
          () => { console.log('Loading failed'); }
        );

        // Configurare i parametri delle prestazioni
        lccObj.setStartLod(0);
        lccObj.setMaxSplats(8000000);
        lccObj.setMaxNodeSplats(4000000);
        lccObj.setMaxDistance(200);

        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });

        renderer.setAnimationLoop(() => {
            LCCRender.update();
            renderer.render(scene, camera);
        });
    </script>
</body>
</html>