Текстура глубины камеры
В Unity камера может генерировать текстуры глубины или текстуры глубины и нормалей. Это минималистичная текстура G-буфера, которую можно использовать для эффектов пост-обработки или для создания пользовательских моделей освещения (например, light pre-pass). На деле камера строит текстуру глубины используя функцию подмены шейдера, таким образом, это вполне можно сделать вручную, в случае необходимости иной настройки G-буфера.
Текстура глубины камеры может быть включена путём использования в скрипте переменной Camera.depthTextureMode.
Есть 2 режима текстуры глубины:
Текстура DepthTextureMode.Depth
Строит текстуру глубины размера экрана.
Depth texture is rendered using the same shader passes as used for shadow caster rendering (ShadowCaster
pass type). So by extension, if a shader does not support shadow casting (i.e. there’s no shadow caster pass in the shader or any of the fallbacks), then objects using that shader will not show up in the depth texture.
addshadow
directive will make them generate a shadow pass too.Note that only “opaque” objects (that which have their materials and shaders setup to use render queue <= 2500) are rendered into the depth texture.
Текстура DepthTextureMode.DepthNormals
Строит 32-битную (8 бит/канал) текстуру размера экрана, в которой нормали пространства вида закодированы в R&G каналы, а глубина закодирована в B&A каналы. Нормали закодированы используя стереографическую проекцию, а глубина - 16-битное значение упакованное в 2 канала по 8 бит.
Присоединяемый файл UnityCG.cginc
имеет вспомогательную функцию DecodeDepthNormal
, предназначенную для декодирования глубины и нормали из закодированного значения пикселя. Возвращает глубину в диапазоне 0..1.
Для примеров использования текстур глубины и нормалей, см. эффект изображения EdgeDetection в проекте-примере Shader Replacement или Эффект изображения SSAO.
Советы и трюки
Camera inspector indicates when a camera is rendering a depth or a depth+normals texture.
Текстура глубины камеры может быть включена путём использования в скрипте переменной Camera.depthTextureMode. that after you disable some effect that needed them, the camera might still continue rendering them. Particularly with multiple effects present on a camera, where each of them needs a depth texture, there’s no good way to automatically “disable” depth texture rendering if you disable the individual effects.
При осуществлении комплексных шейдеров или эффектов пост-обработки не забывайте об отличиях рендеринга между платформами. В частности, использование текстуры глубины в эффекте пост-обработки часто требует особого обращения с Direct3D и сглаживанием.
В некоторых случаях текстура глубины может идти прямо из местного Z-буфера. Если вы видите артефакты в своей текстуре глубины, убедитесь, что шейдеры, которые используют её, не пишут в Z-буфер (используйте ZWrite Off).
Depth textures are available for sampling in shaders as global shader properties. By declaring a sampler called _CameraDepthTexture
you will be able to sample the main depth texture for the camera.
_CameraDepthTexture
always refers to the camera’s primary depth
texture. By contrast, you can use _LastCameraDepthTexture
to refer to the last depth texture rendered by any camera. This could be useful for example if you render a half-resolution depth texture in script using a secondary camera and want to make it available to a post-process shader.
Под капотом
Depth textures can come directly from the actual depth buffer, or be rendered in a separate pass, depending on the rendering path used and the hardware. Typically when using Deferred Shading or Legacy Deferred Lighting rendering paths, the depth textures come “for free” since they are a product of the G-buffer rendering anyway.
Текстура глубины может исходить напрямую из действующего буфера глубины или рендериться в отдельном порядке, в зависимости от используемого способа рендеринга и железа. Когда текстура глубины рендерится в отдельном порядке, это делается через шейдер замещения. Следовательно, важно, чтобы в шейдерах тег “RenderType” был правильным.