Amiga

Вернуться к блогу

Как создать shader в Flutter для эффектной анимации в приложении?

  • Oбновлено: 05.03.2025
  • Время чтения: 3 минуты

Hola, Amigos! Меня зовут Сергей Климович, я Mobile Team Lead агентства заказной разработки Amiga. В мире мобильной разработки Flutter выделяется своей гибкостью и простотой в создании красивых пользовательских интерфейсов. С помощью шейдеров можно добавить дополнительные визуальные эффекты. Об этом я сегодня и расскажу.

Шейдеры предоставляют разработчикам возможность создавать сложные визуальные эффекты, изменять внешний вид элементов интерфейса и даже реализовывать анимации, которых было бы трудно достичь с использованием обычных методов. В этой статье мы рассмотрим, как интегрировать и использовать шейдеры в приложениях Flutter, открыв новые горизонты для креативной реализации дизайнерских идей.

Если вам интересна кроссплатформенная мобильная разработка, фреймворк Flutter, опыт других разработчиков, то приглашаю вас в телеграм-калан Flutter.Много.

Во Flutter уже встроены несколько шейдеров, которые используются в классах LinearGradient, RadialGradient, SweepGradient, ImageShader и т.д. Данные шейдеры мы можем извлечь из этих объектов и использовать их в таких классах, как ShaderMask или CustomPaint. Но что если нужно создать уникальные градиенты, теневые эффекты или реалистичные анимации.

Можно создать собственный шейдер, сделав несколько манипуляций:

  1. Написать шейдер на языке GLSL и поместить его в проект.
  2. Скомпилировать шейдер внешним компилятором в файл SPIR‑V.
  3. Загрузить файл SPIR‑V во Flutter.
  4. Скомпилировать во Flutter SPIR‑V файл.
  5. Создать шейдер из ранее скомпилированного файла SPIR‑V.
  6. Передать этот шейдер в CustomPaint.

Чтобы создать шейдер, нам нужно написать код на GLSL. GLSL — это язык шейдеров высокого уровня, который используется для программирования графического процессора (GPU). Давайте пропустим часть кодирования GLSL и выберем уже закодированный GLSL и изменим его, чтобы он работал с нашим приложением Flutter. 

Чтобы было более предметно и красиво для примера я выберу использование эффекта ниже в шиммере:

Создание шейдера

Создадим файл shader.frag и скопируем код: https://www.shadertoy.com/view/fd33zn

Затем добавим в начало:

#include <flutter/runtime_effect.glsl>  // импорт среды выполнения Flutter uniform vec2 uSize; // универсальная переменная, в которой хранится размер визуализируемого объекта uniform float iTime; // универсальная переменная, в которой хранится время, прошедшее с момента запуска шейдера vec2 iResolution; // переменная, в которой хранится разрешение экрана out vec4 fragColor; // выходная переменная, в которой хранится окончательный цвет визуализируемого объекта

Переименуем mainImage в main и заменим параметры на void.

Добавим две переменные внутри:

iResolution = uSize;       vec2  fragCoord  = FlutterFragCoord();

Интеграция во Flutter


Чтобы не писать много кода для шиммера я просто форкну flutter_shimmer. Создадим отдельный компонент, который будет принимать дочерний элемент и шейдер. Затем мы наложим полученный шейдер поверх него.

Хотите связаться с владельцем
компании напрямую?
Дмитрий Тарасов
Дмитрий Тарасов
СЕО

НАПИСАТЬ

НАПИСАТЬ В МАКС

МАКС