TL;DR
Spark - это высокопроизводительный Gaussian Splatting рендерер для THREE.js, позволяющий рендерить сложные 3D-сцены с фотореалистичным качеством прямо в браузере. Библиотека использует современные WebGL2 техники и эффективно работает даже на мобильных устройствах.
Введение: почему Gaussian Splatting - это game changer
Традиционные методы рендеринга (растеризация, ray tracing) упираются в ограничения производительности при работе с плотными point clouds. Gaussian Splatting решает эту проблему через:
- Параметризацию каждой точки как 3D гауссиана
- Дифференцируемый рендеринг
- Оптимизацию через stochastic gradient descent
Основная часть: интеграция Spark в THREE.js проект
Установка и базовый пример
npm install @sparkjs/core three
import * as THREE from 'three';
import { SparkRenderer } from '@sparkjs/core';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new SparkRenderer();
// Загрузка .splat файла (формат Gaussian Splatting)
const loader = new THREE.SplatLoader();
loader.load('model.splat', (splatCloud) => {
scene.add(splatCloud);
animate();
});
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
Оптимизация производительности
Spark предоставляет несколько critical path оптимизаций:
// Конфиг рендерера для heavy сцен
const renderer = new SparkRenderer({
resolutionScale: 0.7, // SSAA-like качество с меньшим разрешением
sorting: 'front-to-back', // Оптимизация overdraw
maxSplats: 2_000_000 // Лимит для memory management
});
Кастомные шейдеры
Для advanced use cases можно переопределять core шейдеры:
// customSplat.frag
uniform sampler2D positionTexture;
uniform sampler2D colorTexture;
void main() {
vec3 pos = texture(positionTexture, vUv).xyz;
vec4 color = texture(colorTexture, vUv);
// Кастомный tone mapping
color.rgb = pow(color.rgb, vec3(1.0/2.2));
gl_FragColor = color;
}
renderer.replaceShader('splat', customSplatShader);
Практическое применение: кейсы
- Веб-архитектура: Визуализация LiDAR сканов зданий
- Медицина: Рендеринг MRI/CT данных
- Геопространственные системы: 3D карты из аэрофотосъемки
Пример интеграции с React Three Fiber:
import { useLoader } from '@react-three/fiber';
import { Splat } from '@sparkjs/r3f';
function Model() {
const splat = useLoader(THREE.SplatLoader, 'scan.splat');
return <Splat object={splat} />;
}
Заключение
Spark открывает новые горизонты для веб-3D, предлагая:
- Near-native производительность
- Поддержка огромных point clouds (10M+ точек)
- Гибкий API для кастомизации
Библиотека активно развивается - в roadmap есть WebGPU backend и real-time streaming поддержка. Для production use рекомендуется следить за breaking changes (сейчас v0.8.x).
Источник: https://github.com/sparkjsdev/spark