Проблемы связанные с аппаратным обеспечением
В этом разделе руководства описаны типичные проблемы рендеринга 3Д-графики, связанные с аппаратным обеспечением и драйверами, и которые могут возникнуть во время разработки WebGL-приложений.
- Проблемы со сглаживанием при использовании процедурных текстур
- Артефакты пересечения, когда два объекта расположены близко друг к другу
- Артефакты-полосы при использовании градиентов или тёмных сцен
- Слишком много атрибутов
- Слишком много текстурных блоков изображения
Проблемы со сглаживанием при использовании процедурных текстур
Иногда при использовании процедурных текстур могут возникать проблемы со сглаживанием. Например, при использовании карты Checker:
Это происходит, когда в настройках экспорта Anti-Aliasing установлено значение MSAA или Auto (которое по умолчанию использует MSAA 4x на любом совместимом оборудовании). Техника MSAA (мультисемпловое сглаживание) обеспечивает достойное качество изображения и имеет низкое влияние на производительность, однако она не очень хорошо работает для процедурных текстур с резкими изменениями цвета объектов.
Переключение метода Anti-Aliasing на FXAA устраняет проблему:
FXAA использует постобработку для уменьшения ступенчатости и хорошо работает для подобных "граней", создаваемых процедурными картами.
Артефакты пересечения, когда два объекта расположены близко друг к другу
Иногда вы можете столкнуться с артефактами, подобными этим:
Это так называемый z-fighting (техническая документация на «Википедии») и происходит он, когда разные полигоны имеют равную дистанцию до камеры, или их дистанция отличается очень незначительно.
Чтобы исправить это, вам нужно сделать одно из следующих действий:
- Самое простое решение - расположить объекты дальше друг от друга.
- Увеличьте дистанцию near (или clip start) камеры и/или уменьшите дистанцию far (или clip end) камеры. Это сделает диапазон расстояний камеры меньше и тем самым повысит точность значений, хранящихся в буфере глубины.
- Если вам нужно разместить текстуру билборда над какой-либо поверхностью — отключите Depth Test на материале билборда и увеличьте параметр Rendering Order на объекте. Билборд будет отображаться после объекта поверхности и будет игнорировать глубину, сохраненную этим объектом. Это эффективно устраняет z-fighting, который может произойти между этими двумя объектами.
Артефакты-полосы при использовании градиентов или тёмных сцен
При использовании градиентов и затемнённых сцен возможно возникновение следующих артефактов в виде полос:
Эти артефакты вызваны ограничением точности цветовых буферов и могут быть устранены (или существенно уменьшены) посредством использования дитеринга:
Инструкции по включению дитеринга находятся в соответствующих разделах: «Блендер», «3дс Макс», or «Майя».
Слишком много атрибутов
Время от времени при работе над сценой вы можете столкнуться с проблемой, когда некоторые объекты не отрисовываются вообще, а в консоли браузера появляется следующая ошибка:
Эта ошибка означает, что некоторые объекты (очевидно те, которые не смогли быть отрисованы) превышают максимальное количество вертексов, которые могут быть использовать в одном шейдере.
То, сколько атрибутов использует объект, зависит от различных факторов: наличие и количество 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 |
Добавьте для каждой из следующих нод материала объекта, которые используют различные* вертексные цвета:
|
| +1x |
Добавьте для каждой из следующих нод материала объекта, которые используют различные* карты нормалей кроме первой (она уже покрыта обязательным атрибутом uv, см. первую строку):
|
| +1 |
Добавьте, если материал объекта имеет одну из следующих нод:
|
| +1 |
Добавьте, если материал объекта имеет одну из следующих нод:
|
Если несколько узлов используют один и тот же вертексный цвет или карту нормалей, то все эти ноды считаются как одна.
Как правило, достаточно оставаться в пределах 16 вертексных атрибутов (хотя некоторые старые/низкокачественные устройства могут поддерживать только 8). Чаще всего вам следует беспокоиться только об объектах, использующих несколько ключей формы. В остальном количество вертексных атрибутов обычно не превышает лимит для типичного объекта/материала.
Слишком много текстурных блоков изображения
Эта ошибка аналогична проблеме с превышением максимального количества атрибутов, описанной выше. Каждая текстура или карта теней занимает один текстурный блок изображения. Для устранения ошибки необходимо уменьшить количество источников, отбрасывающих тени, отключить тени, либо ограничить максимальное количество текстур в материалах.
Остались вопросы?
Задайте их на нашем форуме!