Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Камеры и текстуры глубины

КамераКомпонент, создающий изображение с определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь
может генерировать глубину, глубину + нормали или текстуру вектора движения. Это минималистичная текстура G-буфера, которую можно использовать для постобработкипроцесса, улучшающего визуальные эффекты продукта путем применения фильтров и эффектов. до появления изображения на экране. Вы можете использовать эффекты постобработки для имитации физических свойств камеры и пленки, например Bloom и Depth of Field. Подробнее постобработка, постобработка, постобработка
Посмотреть в Словарь
эффекты или реализовать пользовательские модели освещения (например, -проходить).

Они в основном используются эффектами; например, эффекты постобработки часто используют информацию о глубине.

Значения пикселей в текстуре глубины находятся в диапазоне от 0 до 1 с нелинейным распределением. Точность обычно составляет 32 или 16 бит, в зависимости от используемой конфигурации и платформы. При чтении из текстуры глубины возвращается значение высокой точности в диапазоне от 0 до 1. Если вам нужно получить расстояние от камеры или другое линейное значение 0–1, вычислите это вручную с помощью вспомогательных макросов (см. ниже).

Текстуры глубины поддерживаются большинством современных аппаратных средств и графических API. Особые требования перечислены ниже:

  • Direct3D 11+ (Windows), OpenGL 3+ (Mac/Linux), OpenGL ES 3.0+ (iOS), Metal (iOS) и такие консоли, как PS4/Xbox One, поддерживают текстуры глубины.
  • Для OpenGL ES 2.0 (Android) требуется расширение GL_OES_depth_texture для присутствовать.
  • WebGLAPI JavaScript, который отображает 2D- и 3D-графику в веб-браузере. Вариант сборки Unity WebGL позволяет Unity публиковать контент в виде программ JavaScript, использующих технологии HTML5 и API рендеринга WebGL для запуска контента Unity в веб-браузере. Подробнее
    См. в Словарь
    требуется WEBGL_depth_texture расширение.

Режим текстуры глубины камеры можно включить с помощью переменной Camera.depthTextureMode из скрипта. Аналогичные текстуры также можно создавать самостоятельно, используя функцию Замена шейдера.

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

  • DepthTextureMode.Depth: текстура глубины.
  • DepthTextureMode.DepthNormals: нормали глубины и пространства обзора упакованы в одну текстуру.*
  • DepthTextureMode.MotionVectors: попиксельное перемещение каждого текселя экрана для текущего кадра. Упакован в текстуру RG16.

Это флаги, поэтому можно указать любую комбинацию вышеуказанных текстур.

DepthTextureMode.Текстура глубины

Создается текстура глубины размером с экран.

Текстура глубины визуализируется с использованием того же шейдерапрограммы, которая работает на графическом процессоре. Подробнее
См. в Словарь
проходы, используемые для заклинателя теней рендерингПроцесс вывода графики на экран (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь
(ShadowCaster тип пропуска). Таким образом, если шейдер не поддерживает отбрасывание теней (т. е. в шейдере нет прохода отбрасывателя теней или какого-либо резервного варианта), то объекты, использующие этот шейдер, не будут отображаться в текстуре глубины.

  • Сделайте свой шейдер откатом к другому шейдеру, у которого есть проход отбрасывания теней, или
  • Если вы используете поверхностные шейдерыупрощенный способ написания шейдеры для встроенного конвейера рендеринга. Подробнее
    См. в Словарь
    добавление addshadow заставит их также генерировать теневой проход.

Обратите внимание, что только «непрозрачные» объекты (те, материалы и шейдеры которых настроены на использование очереди рендеринга <= 2500) визуализируются в текстуре глубины.

Текстура DepthTextureMode.DepthNormals

При этом создается 32-битная (8 бит/канал) текстура размером с экран, в которой нормали пространства просмотра кодируются в каналы R&G, а глубина кодируется в каналах B&A. Нормали кодируются с использованием стереографической проекции, а глубина представляет собой 16-битное значение, упакованное в два 8-битных канала.

включаемый файл UnityCG.cginc имеет вспомогательную функцию DecodeDepthNormal для декодирования глубины и нормали из закодированного пикселянаименьшей единицы компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
Смотреть в Словарь
. Возвращаемая глубина находится в диапазоне 0..1.

Примеры использования текстуры глубины и нормалей см. в разделе Замена шейдеров во время выполнения или Screen Space Ambient. Эффект окклюзии.

Текстура DepthTextureMode.MotionVectors

При этом создается текстура RG16 (16-бит с плавающей запятой/канал) размером с экран, в которой движение пикселя экранного пространства кодируется в каналы R&G. Движение пикселя кодируется в UV-пространстве экрана.

При выборке из этой текстуры движение закодированного пикселя возвращается в диапазоне от –1 до 1. Это будет смещение UV от последнего кадра до текущего кадра.

Советы и рекомендации

Инспектор камеры указывает, когда камера визуализирует текстуру глубины или текстуры глубины и нормалей.

То, как текстуры глубины запрашиваются у камеры (Camera.depthTextureMode), может означать, что после отключения эффекта, который в них нуждался, Камера может продолжить их рендеринг. Если на камере присутствует несколько эффектов, каждому из которых нужна текстура глубины, нет хорошего способа автоматически отключить рендеринг текстуры глубины, если вы отключите отдельные эффекты.

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

В некоторых случаях текстура глубины может быть получена непосредственно из собственного Z-буфера. Если вы видите артефакты в текстуре глубины, убедитесь, что использующие ее шейдеры не выполняют запись в буфер Z (используйте ZWrite Off) .

Переменные шейдера

Текстуры глубины доступны для выборки в шейдерах как глобальные свойства шейдера. Объявив сэмплер с именем _CameraDepthTexture, вы сможете сэмплировать основную текстуру глубины для камеры.

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

Текстура векторов движения (если она включена) доступна в шейдерах как глобальное свойство шейдера. Объявив сэмплер с именем «_CameraMotionVectorsTexture», вы можете сэмплировать текстуру для текущей камеры.

Под капотом

Текстуры глубины могут быть получены непосредственно из фактического буфера глубиныхранилища памяти, в котором хранится глубина z-значения каждого пикселя в изображение, где z-значение — это глубина каждого отображаемого пикселя от плоскости проекции. Подробнее
См. в Словарь
, или рендериться в отдельном проходе, в зависимости от рендеринга используемый путь и оборудование. Обычно при использовании Deferred Затенение или устаревшее отложенное освещение пути рендерингаТехника, которую Unity использует для рендеринга графики. Выбор другого пути влияет на производительность вашей игры и на то, как рассчитываются освещение и затенение. Некоторые пути больше подходят для разных платформ и оборудования, чем другие. Подробнее
Посмотрите в Словарь
, текстуры глубины предоставляются «бесплатно», поскольку они продукт В любом случае рендеринг G-буфера.

Когда текстура DepthNormals визуализируется в отдельном проходе, это делается с помощью замены шейдера. Следовательно, важно иметь правильный тег «RenderType» в ваших шейдерах.

Если этот параметр включен, текстура MotionVectors всегда получается из дополнительного прохода рендеринга. Unity будет визуализировать движущиеся GameObjectsосновные объекты в сценах Unity, которые могут представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. . Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Посмотреть в Словарь
в этот буфер и построить их движение от последнего кадра до текущий кадр.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3