Текст на основе SDF в Babylon.js: изучаем 3D-текст нового поколения
Когда речь заходит о качественном тексте в 3D-сцене, мы часто сталкиваемся с проблемами: пикселизация, потеря четкости при масштабировании, сложность рендеринга больших объёмов. Решение существует — это технология Signed Distance Field (SDF). В этой статье я на практике покажу, как использовать SDF-текст в Babylon.js, разберу пример из Playground и объясню, почему это — будущее веб-типографики в 3D.
Мы рассмотрим реальный рабочий код, который я адаптировал из официального примера Babylon.js Playground, и покажу, как встроить его в свой проект. Никаких абстракций — только практика и мой личный опыт.
Что такое SDF и почему это важно
Signed Distance Field (поле со знаком расстояния) — это метод хранения информации о контурах символов в текстуре. Вместо того чтобы рендерить каждый глиф как набор пикселей, мы храним расстояние до ближайшего края. Это позволяет масштабировать текст без потери качества и использовать сложные эффекты (обводка, тени, свечение) прямо в шейдере.
Живой пример: SDF-текст в действии
Ниже встроен работающий пример из Babylon.js Playground. Это та самая сцена, где текст «парит» в пространстве и плавно меняет размер. Обратите внимание на чёткость даже при сильном увеличении.
Разбор кода: как это работает
Я взял за основу код из примера и адаптировал его для своих задач. Давайте разберём ключевые части.
Загрузка шрифта и создание рендерера
// Загружаем JSON-описание шрифта (SDF-данные)
const sdfFontDefinition = await (await fetch("https://assets.babylonjs.com/fonts/roboto-regular.json")).text();
const fontAsset = new ADDONS.FontAsset(sdfFontDefinition, "https://assets.babylonjs.com/fonts/roboto-regular.png");
// Создаём рендерер текста
const textRenderer = await ADDONS.TextRenderer.CreateTextRendererAsync(fontAsset, engine);
Добавление текста с настройками
// Добавляем абзац с максимальной шириной 1400 пикселей
textRenderer.addParagraph(
`Ваш длинный текст...`,
{ maxWidth: 1400 }
);
// Задаём цвет текста (розовый для наглядности)
textRenderer.color = new BABYLON.Color4(1.0, 0.2, 0.5, 1.0);
Анимация и рендеринг
scene.onAfterRenderObservable.add(() => {
// Рендерим текст в каждом кадре
textRenderer.render(camera.getViewMatrix(), camera.getProjectionMatrix());
// Плавное изменение расстояния камеры
const frameTime = engine.getDeltaTime();
camera.radius += (0.05 * frameTime / 20);
if (camera.radius > 100) camera.radius = 5;
});
maxWidth, color и скоростью анимации. SDF-текст отлично подходит для динамических интерфейсов и интерактивных презентаций.
Лицензия и ссылка на источник
Пример основан на официальном коде Babylon.js, который распространяется под лицензией Apache-2.0. Это значит, что вы можете свободно использовать его в своих проектах, но с обязательным указанием авторства.
Где применять SDF-текст
- VR/AR-интерфейсы — текст остаётся читаемым под любым углом.
- Дашборды и аналитика — чёткие надписи на 3D-графиках.
- Игровые интерфейсы — динамические подписи, диалоги.
- 3D-презентации — эффектные титры и анимированный текст.