Google Filament
Filament - движок для физически правдоподобного рендеринга (PBR) в реальном времени на Android и других платформах. Он предоставляет модель сцены, материалы, освещение и инструменты для ассетов поверх низкоуровневых графических API. Он подходит, когда приложению нужна интерактивная 3D-графика без разработки собственного рендерера.
Основы Filament
Что это такое
При работе с OpenGL ES или Vulkan приложение напрямую управляет графическим состоянием и командами отрисовки. Filament вместо этого предоставляет камеры, сущности, отображаемые объекты, источники света и материалы. Движок берёт на себя значительную часть работы с шейдерами, освещением и графическим бэкендом, но приложение по-прежнему отвечает за содержимое сцены и жизненный цикл ресурсов.
Для локального шейдерного эффекта в интерфейсе без 3D-сцены обычно проще использовать AGSL и RuntimeShader.
Как устроен
Engineсоздаёт ресурсы Filament и управляет ими.Sceneсодержит сущности, участвующие в отрисовке, например объекты и источники света.Camera- компонент сущности, задающий положение наблюдателя и проекцию.ViewвыбираетSceneиCamera, настраивает область вывода и параметры рендеринга.RendererотправляетViewна отрисовку кадра.SwapChainсвязывает рендеринг с поверхностью платформы.
В типичном Android-приложении создают Engine, Renderer, Scene, View, Camera и SwapChain для текущей поверхности. Кадр проходит через beginFrame(swapChain), render(view) и endFrame(); если beginFrame() возвращает false, отрисовку пропускают. Размер области вывода View нужно обновлять при изменении поверхности.
Поверхность Android может быть пересоздана независимо от Activity. При её изменении пересоздай SwapChain, при паузе останови планирование кадров, а после завершения владельца освободи ресурсы Filament. Android-класс UiHelper помогает интегрироваться с поверхностью. Отсоединённую или уничтоженную поверхность нельзя считать действительной целью рендеринга.
Связь с графическими API
На Android Filament может использовать OpenGL ES или Vulkan как бэкенд. При этом приложению не нужно писать вызовы отрисовки для каждого объекта под конкретный API. Но ограничения GPU остаются: расход памяти на текстуры, избыточная отрисовка, сложность ассетов и время кадра требуют измерений на целевых устройствах.
Модель сцены
Камеры
Камера задаёт положение и ориентацию наблюдателя, а также проекцию. Для перспективной проекции видимую область определяют угол обзора, соотношение сторон и ближняя/дальняя плоскости отсечения. Сама камера ничего не рисует: View использует её для отображения Scene. При изменении размеров вывода обновляй проекцию и область отрисовки.
Сцены
Scene включает сущности с компонентами отображаемого объекта или источника света. Компоненты трансформации задают положение объектов; геометрия и материалы определяют их внешний вид. Сцена может содержать одну модель или множество объектов, источников света и окружение. Анимация обновляет состояние сцены, а рендерер строит кадры для выбранного View.
Материалы
Материалы Filament задают свойства поверхности: базовый цвет, металлический отклик, шероховатость, карту нормалей, прозрачность и свечение. У одного скомпилированного материала могут быть экземпляры с разными параметрами и текстурами. PBR обеспечивает согласованную модель освещения, но качество изображения всё равно зависит от текстур, света и работы с цветом.
Освещение
Filament поддерживает прямые источники света и освещение от окружения (IBL). Окружение может давать фоновый свет и отражения, особенно полезные для PBR-материалов. Источники света, тени, отражения и свойства материалов увеличивают стоимость кадра; подбирай их с учётом бюджета времени.
Ассеты и сценарии применения
Библиотека gltfio загружает ассеты glTF 2.0; инструменты материалов компилируют описания материалов Filament. Поэтому движок подходит для просмотра моделей, демонстрации товаров, конфигураторов и интерактивной 3D-визуализации. Загрузка, декодирование и освобождение ассетов всё равно требуют внимания к памяти и жизненному циклу.
Для обычных экранов приложения, графиков и простой 2D-отрисовки чаще достаточно Compose, Views или Canvas. Более широкий выбор инструментов описан в статье 2D- и 3D-рендеринг.