Utilizando Depth Textures (Texturas de profundidad)
Diferencias especificas de rendering por plataforma

La Depth Texture (Textura de Profundidad) de la cámara

Una Cámara puede generar una profundidad, profundidad + normales o una textura de vector de movimiento. Esta es una textura minimalista de G-buffer que se puede usar para efectos de post-procesamiento o para implementar modelos de iluminación personalizados (por ejemplo, pre-pass de luz). También es posible crear texturas similares usando la característica Shader Replacement.

El modo de Textura de profundidad de la cámara se puede habilitar utilizando la variable Camera.depthTextureMode desde script.

Hay tres modos posibles de texturas de profundidad:

  • DepthTextureMode.Depth: una depth texture.
  • DepthTextureMode.DepthNormals: profundidad y normales del espacio de vista empaquetadas en una textura.*
  • DepthTextureMode.MotionVectors: movimiento del espacio Por-píxel de la pantalla de cada texel de la pantalla para el marco actual. Empaquetado en una textura RG16.

Estas son flags, por lo que es posible especificar cualquier combinación de las texturas anteriores.

DepthTextureMode.Depth texture

Esto construye una depth texture del tamaño de la pantalla.

La textura de profundidad se procesa usando los mismos pases shader que se usan para la renderización del shader caster (tipo de paso “ShadowCaster”). Por lo tanto, por extensión, si un shader no admite shadow casting (es decir, no hay pass de shadow caster o cualquiera de los fallbacks), entonces los objetos que utilizan ese shader no aparecerán en la textura de profundidad.

  • Haga su shader fallback a otro shader que tiene un shadow casting pass, o
  • Si usted está utilizando surface shaders, agregar una directiva addshadow hará que generen un shadow pass también.

Tenga en cuenta que sólo los objetos “opacos” (que tienen sus materiales y shaders configurados para utilizar render queue mayor o igual a 2500) se renderizan en la textura de profundidad.

DepthTextureMode.DepthNormals texture

Esto construye una textura de 32 bits (8 bits/canal) del tamaño de la pantalla, donde las normales de espacio de vista se codifican en canales R & G, y la profundidad se codifica en canales B & A. Los estándares se codifican utilizando la proyección estereográfica, y la profundidad es un valor de 16 bits empaquetado en dos canales de 8 bits.

UnityCG.cginc include file tiene una función de ayuda DecodeDepthNormal para de-codificar la profundidad y normal del valor de pixel codificado. La profundidad devuelta está en un rango 0..1.

Para obtener ejemplos sobre cómo usar la textura de profundidad y normalización, consulte el efecto de imagen de EdgeDetection en el proyecto de ejemplo Shader Replacement o Screen Space Ambient Occlusion Image Effect.

DepthTextureMode.MotionVectors texture

Esto crea una textura RG16 (16-bit float/canal) de tamaño de la pantalla, donde el movimiento de píxeles de espacio de pantalla se codifica en los canales R & G. El movimiento de píxeles está codificado en el espacio UV de la pantalla.

When sampling from this texture motion from the encoded pixel is returned in a rance of –1..1. This will be the UV offset from the last frame to the current frame.

Consejos & Trucos

Camera inspector indica cuando una cámara está renderizando una textura de profundidad o una textura de profundidad+normales.

La forma en que se solicitan texturas de profundidad desde la cámara (Camera.depthTextureMode) podría significar que después de desactivar un efecto que los necesitaba, la cámara podría continuar procesándolos. Si hay varios efectos presentes en una cámara, donde cada uno de ellos necesita la textura de profundidad, no hay una buena manera de desactivar automáticamente la textura de textura profunda si deshabilita los efectos individuales.

Al implementar shaders o efectos de imagen complejos, tenga en cuenta lasdiferencias de renderizado entre plataformas. En particular, el uso de la textura de profundidad en un efecto de imagen a menudo necesita un manejo especial en Direct3D + Anti-Aliasing.

En algunos casos, la textura de profundidad puede venir directamente del buffer Z nativo. Si ve artefactos en su textura de profundidad, asegúrese de que los shaders que lo usan no escriban en el búfer Z (utilice ZWrite Off).

Variables Shader

Las texturas de profundidad están disponibles para el muestreo en sombreadores como propiedades globales shader. Al declarar un sampler llamado _CameraDepthTexture, podrá probar la textura de profundidad principal de la cámara.

_CameraDepthTexture siempre se refiere a la textura de profundidad principal de la cámara Por el contrario, puede utilizar _LastCameraDepthTexture para referirse a la textura de la última profundidad renderizada por cualquier cámara. Esto podría ser útil, por ejemplo, si renderiza una textura de profundidad de media resolución en un script utilizando una cámara secundaria y quieres hacerlo disponible para un shader posterior al proceso.

La textura de vectores de movimiento (cuando está habilitada) está disponible en Shaders como una propiedad global de Shader. Al declarar un sampler llamado ‘_CameraMotionVectorsTexture’ puede probar la textura de la cámara de renderización actual.

Bajo el capó

Las texturas de profundidad pueden venir directamente del buffer de profundidad real, O se renderizará en un pase separado, dependiendo del rendering path utilizado y el hardware. Típicamente, cuando se utiliza Deferred Shading o Legacy Deferred Lighting rendering paths, las texturas de profundidad vienen “gratis” ya que son productos del rendering del G-buffer de todos modos.

Cuando la textura de DepthNormals se representa en un pase separado, esto se hace a través de Shader Replacement. Por lo tanto, es importante tener la etiqueta correcta “RenderType” en sus shaders.

Cuando está activada, la textura de MotionVectors siempre proviene de un pase de render adicional. Unity hará que los GameObjects se mueva en este búfer y construye su movimiento desde el último frame hasta el frame actual.

Mirar también

Utilizando Depth Textures (Texturas de profundidad)
Diferencias especificas de rendering por plataforma