SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Веб-разработка

Почему шейдер не работает на телефоне

Телефоны выполняют шейдеры, но конкретная программа может не скомпилироваться, использовать неподдерживаемую возможность или оказаться слишком тяжёлой. Сначала определите, что именно не работает: сборка, отрисовка или скорость.

Проверить ошибку компиляции

Для WebGL получите статус компиляции и журнал. Непустой журнал может содержать предупреждение, поэтому решение об ошибке принимайте по COMPILE_STATUS, а не только по наличию текста.

gl.compileShader(shader);
const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
const log = gl.getShaderInfoLog(shader);
if (!compiled) {
    throw new Error(log || 'Shader compilation failed');
}

Фрагмент предполагает созданные WebGL-контекст gl, объект shader и ранее установленный исходный код. В движке вроде Unity используйте его журнал сборки и диагностику материала, а не этот JavaScript.

Сверить графическую среду

  • Проверьте фактический API и его версию: WebGL, OpenGL ES, Vulkan или Metal — разные среды.
  • Сравните версию языка шейдера, используемые расширения, типы текстур и ограничения ресурсов.
  • Проверьте ветку компиляции и вариант шейдера, выбранный для мобильной сборки.
  • Сведите пример к простому вершинному и фрагментному шейдеру, затем возвращайте эффекты по одному.

Если шейдер работает медленно

Измеряйте время кадра на целевом устройстве, уменьшайте сложность эффекта и объём обрабатываемых пикселей. Медленная работа и ошибка компиляции требуют разных действий. Перегрев и режим питания способны влиять на скорость, но не являются универсальным доказательством «отключения шейдеров производителем».

Что сообщить при диагностике

Модель устройства, версия ОС, графический API, движок/браузер, полный compile/link log и минимальный пример полезнее общего сообщения «не работает на телефоне».

Документация