Ограничения WebGPU графики API
WebGPU графика API предоставляет полезные графические возможности. Но она также имеет некоторые ограничения, о которых вы должны знать:
- Особенности, не поддерживаемые в WebGPU
- Ограниченная поддержка браузера
- Ограничения вычисления шейдера
- GPU просмотр
- Ограничения формата текстуры
- Каналы текстуры рендеринга
- Пределы текстуры местности
- Шрифты
- Глобальное освещение
- Видео
- Варианты шейдера
Функции, не поддерживаемые в WebGPU
Хотя WebGPU разблокирует полезные графические функции, есть несколько, которые он не поддерживает пока:
- Асинхронные вычисления
- Динамическое разрешение
- Массивы кубических карт
Ограниченная поддержка браузеров
WebGPU в настоящее время находится в экспериментальном состоянии и не поддерживается всеми браузерами и устройствами. Дополнительную информацию см. в веб-документации MDN по Доступ к устройству и Совместимость браузеров. Для поддержки браузеров см. Могу ли я использовать: WebGPU.
Ограничения вычисления шейдера
Существует несколько ограничений для вычисления шейдера в Web.
Нет RWBuffer поддержки
Вы можете использовать структурированные буферы, RWStructuredBuffer, но не RWBuffer в вычислительных шейдерах. Ограниченные форматы текстур хранилища с чтением и записью. WebGPU поддерживает лишь ограниченный набор форматов текстур для текстур хранилища с чтением и записью в вычислительных шейдерах. HLSL не указывает тип доступа к текстуре хранилища явно, поэтому он выводится из способа использования.
RWTexture2D<float> tex; // storage texture
tex[uv] = 1.0f; // write only
tex[uv] += 1.0f; // read-write
Тексты хранения только для записи обычно поддерживаются намного лучше. См. Ограничения формата текстуры.
Анализ строгой однородности
В WebGPU вы должны вызывать функции барьера только из единого потока управления. В противном случае WebGPU не сможет компилировать шейдер. Единый поток управления обеспечивает, что все потоки в группе потоков следуют одному и тому же пути выполнения и одновременно достигают барьера.
Функции барьера HLSL:
GroupMemoryBarrierGroupMemoryBarrirWithGroupSyncDeviceMemoryBarrierDeviceMemoryBarrierWithGroupSyncAllMemoryBarrierAllMemoryBarrierWithGroupSync
Асинхронные вычисления
WebGPU не поддерживает асинхронные вычисления.
Нет HLSL расширенных функций
WebGPU не поддерживает следующие функции:
Волновые свойства (WaveBasic, WaveVote, WaveBallot, WaveMath, WaveMultiPrefix)
QuadShuffle
Int64
Native16Bit
GPU считывание
WebGPU не поддерживает синхронное считывание данных буфера или текстуры из GPU в CPU. Следующие функции не будут работать:
Texture2D.GetPixels
ComputeBuffer.GetData
ScreenCapture.CaptureScreenshot
ScreenCapture.CaptureScreenshotAsTexture
Вместо этого, используйте AsyncGPUReadback API для чтения данных буфера или текстуры из GPU в CPU. Для съемки экрана, используйте ScreenCapture.CaptureScreenshotIntoRenderTexture вместе с AsyncGPUReadback.
Ограничения формата текстуры
Информацию о возможностях формата текстуры WebGPU см. в документации W3 по WebGPU. Некоторые форматы более ограничены, чем другие APIs, особенно для использования текстуры хранения.
Например, WebGPU не поддерживает RGBA8 или RHalf в качестве формата текстуры хранения с чтением-записью. Если вы создаете RenderTexture в этом формате, вы должны установить enableRandomWrite на false, что является значением по умолчанию.
Однако, WebGPU поддержки RFloat как формат текстуры хранения, так что если вы создаете RenderTexture с RFloat формат, enableRandomWrite не нужно быть false.
Вы можете использовать SystemInfo.GetCompatibleFormat, чтобы найти формат, который будет работать для данного использования.
Отображение текстурных каналов
Тип выхода фрагментного шейдера должен иметь большее или равное число каналов, чем формат текстуры целевого рендеринга.
Если RenderTexture является RGBA, то у него 4 канала. Фрагментный шейдер должен вывести float4 или half4. Если он возвращает float или half, WebGPU столкнется с ошибкой, потому что есть каналы текстуры рендеринга, которые не будут инициализированы.
Если RenderTexture является R8, то у него есть 1 канал. Фрагментный шейдер может тогда вывести float или half. Фрагментный шейдер может также возвратить float4 или half4, и дополнительные выходные каналы будут проигнорированы.
Пределы текстуры местности
Количество текстур, доступных из шейдера, ограничено 16 на многих платформах. Это ограничение может быть превышено рендерером местности, особенно с текстурами слоев. Это может сделать рендерирование местности проблематичным для WebGPU. Рекомендуется ограничить количество слоев текстуры местности, которые вы используете.
Рекомендации по использованию шрифтов в вебе
Unity Web поддерживает динамическое отображение шрифтов, подобно другим платформам Unity. Однако Unity Web не имеет доступа к шрифтам, установленным на компьютере пользователя, так что если вы хотите использовать какие-либо шрифты, включите их в папку проекта (включая любые резервные шрифты для международных символов или жирные/курсивные версии шрифтов) и установите в качестве резервных имен шрифтов.
Ограничения на глобальное освещение в Интернете
Unity Web только поддерживает Запеченное глобальное освещение. Realtime Global Illumination в настоящее время не поддерживается в Web. Кроме того, Unity Web поддерживает только ненаправленные lightmaps.
Рекомендации по использованию видео в Интернете
Вы не можете использовать VideoClipImporter для импортирования видеоклипов в ваш проект Unity, поскольку это может увеличить размер первоначальной загрузки данных ассета и воспрепятствовать потоковой передаче по сети.
- Используйте параметр
URLв компоненте VideoPlayer. - Поместите ресурс в каталог
StreamingAssets, чтобы использовать встроенную сетевую потоковую передачу браузера.
Ограничения на варианты шейдеров в Веб
Из-за ограниченной памяти в Web, не включайте нежелательные варианты шейдеров, так как это может привести к ненужному использованию памяти. Поэтому рекомендуется ознакомиться с варианты шейдеров и шейдер стрипинг. Кроме того, убедитесь, что вы не добавляете шейдеры со слишком большим количеством вариантов (например, Unity’s Стандартный шейдер) к Всегда включённые шейдеры раздел в Настройки графики.