Проблемы связанные с аппаратным обеспечением

В этом разделе руководства описаны типичные проблемы рендеринга 3Д-графики, связанные с аппаратным обеспечением и драйверами, и которые могут возникнуть во время разработки WebGL-приложений.

Проблемы со сглаживанием при использовании процедурных текстур

Иногда при использовании процедурных текстур могут возникать проблемы со сглаживанием. Например, при использовании карты Checker:

Это происходит, когда в настройках экспорта Anti-Aliasing установлено значение MSAA или Auto (которое по умолчанию использует MSAA 4x на любом совместимом оборудовании). Техника MSAA (мультисемпловое сглаживание) обеспечивает достойное качество изображения и имеет низкое влияние на производительность, однако она не очень хорошо работает для процедурных текстур с резкими изменениями цвета объектов.

Переключение метода Anti-Aliasing на FXAA устраняет проблему:

FXAA использует постобработку для уменьшения ступенчатости и хорошо работает для подобных "граней", создаваемых процедурными картами.

Артефакты пересечения, когда два объекта расположены близко друг к другу

Иногда вы можете столкнуться с артефактами, подобными этим:

Артефакты z-файтинга

Это так называемый z-fighting (техническая документация на «Википедии») и происходит он, когда разные полигоны имеют равную дистанцию до камеры, или их дистанция отличается очень незначительно.

Чтобы исправить это, вам нужно сделать одно из следующих действий:

Артефакты-полосы при использовании градиентов или тёмных сцен

При использовании градиентов и затемнённых сцен возможно возникновение следующих артефактов в виде полос:

Рендеринг без дитеринга

Эти артефакты вызваны ограничением точности цветовых буферов и могут быть устранены (или существенно уменьшены) посредством использования дитеринга:

Рендеринг с включённым дитерингом

Инструкции по включению дитеринга находятся в соответствующих разделах: «Блендер», «3дс Макс», or «Майя».

Слишком много атрибутов

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

Ошибка "Too many attributes" в браузерной консоли

Эта ошибка означает, что некоторые объекты (очевидно те, которые не смогли быть отрисованы) превышают максимальное количество вертексов, которые могут быть использовать в одном шейдере.

То, сколько атрибутов использует объект, зависит от различных факторов: наличие и количество shape keys (Блендер) / morph targets (3дс Макс) / blend shapes (Майя), наличие скиннинга, определенных нод материалов и т.д.

Вот таблица, которая объясняет, как рассчитать количество используемых атрибутов:

Число атрибутов Описание
3 Обязательные атрибуты: position, normal, uv.
+2x (WebGL 1.0)

Добавляется за каждый shape key («Блендер») / morph target («3дс Макс») / blend shape target («Майя»). Максимальное количество атрибутов для для этой категории ограничено +12.

Для современного оборудования, поддерживающего стандарт WebGL 2.0, морфинг не требует атрибутов.

+2 Добавляется если объект использует скиннинг
+1x Добавьте для каждой из следующих нод материала объекта, которые используют различные* вертексные цвета:
  • «Блендер»: Attribute, Vertex Color
+1x Добавьте для каждой из следующих нод материала объекта, которые используют различные* карты нормалей кроме первой (она уже покрыта обязательным атрибутом uv, см. первую строку):
  • «Блендер»: UV Map
  • «3дс Макс»: Bitmap (только если "Mapping Type" выставлен на "Texture") Gradient Ramp, Noise (только если "Mapping" выставлен на "Explicit Map Channel")
  • «Майя»: place2dTexture
+1 Добавьте, если материал объекта имеет одну из следующих нод:
  • «Блендер»: Normal Map, Tangent (только в режиме "UV Map")
  • «3дс Макс»: Normal Bump
  • «Майя»: aiNormalMap, bump2d (только во вход "Bump Interp" > 0), samplerInfo
+1 Добавьте, если материал объекта имеет одну из следующих нод:
  • «3дс Макс»: Vertex Color

Если несколько узлов используют один и тот же вертексный цвет или карту нормалей, то все эти ноды считаются как одна.

Как правило, достаточно оставаться в пределах 16 вертексных атрибутов (хотя некоторые старые/низкокачественные устройства могут поддерживать только 8). Чаще всего вам следует беспокоиться только об объектах, использующих несколько ключей формы. В остальном количество вертексных атрибутов обычно не превышает лимит для типичного объекта/материала.

Слишком много текстурных блоков изображения

Эта ошибка аналогична проблеме с превышением максимального количества атрибутов, описанной выше. Каждая текстура или карта теней занимает один текстурный блок изображения. Для устранения ошибки необходимо уменьшить количество источников, отбрасывающих тени, отключить тени, либо ограничить максимальное количество текстур в материалах.

Ошибка "Too many texture image units" в браузерной консоли

Остались вопросы?

Задайте их на нашем форуме!