Light Probes
Grupo de Luces de Sonda(Light Probe Group)

Componente Light Probe Proxy Volumes

El componente Light Probe Proxy Volume (LPPV) le permite a usted utilizar más información de iluminación para GameObjects grandes dinámicos que no pueden utilizar baked lightmaps (por ejemplo Particle Systems grandes o skinned Meshes).

Por defecto, un Renderer iluminado por un prob recibe iluminación de un solo Light Probe que es interpolado entre los Light Probes circundantes en la escena. Debido a esto, los GameObjects tiene una iluminación ambiental constante a través de la superficie. Esta iluminación tiene un gradiente de rotación porque está utilizando armónicos esféricos, pero carece de un gradiente espacial. Esto es más notable en los GameObjects o Particle Systems más grandes. La iluminación en el GameObject coincide con la iluminación en el punto de anclaje, y si el GameObject sobrepasa un gradiente de iluminación, las partes del GameObject pueden parecer incorrectas.

El componente Light Probe Proxy Volume genera una cuadrícula 3D de Light Probes interpolados dentro de un Bounding Volume (volumen delimitado). Puede especificar la resolución de esta cuadrícula en la interfaz de usuario del componente. Los coeficientes de armónicos esféricos (SH) de los Light Probes interpolados se cargan en texturas 3D. Las texturas 3D que contienen coeficientes SH se muestrean a continuación en el tiempo de renderizado para calcular la contribución a la iluminación ambiental difusa. Esto agrega un gradiente espacial a los GameObjects iluminados con probes.

El Standard Shader soporta esta función. Para agregar esto a un shader personalizado, utilice la función ShadeSHPerPixel. Para aprender a implementar esta función, consulte el código ejemplo de Particle System sample Shader en la parte inferior de esta página.

Cuándo utilizar el componente

La mayoría de los componentes de Renderer en Unity contienen Light Probes. Hay tres opciones para los Light Probes:

  • Off: el Renderer no utiliza Light Probes interpolados.

  • Blend Probes (valor por defecto): el Renderer utiliza un Light Probe interpolado.

  • Use Proxy Volume: el Renderer utiliza una cuadrícula 3D de Light Probes interpolados.

Cuando configure la propiedad Light Probes en Use Proxy Volume, el GameObject debe tener un componente Light Probe Proxy Volume (LPPV) adjunto. Puede agregar un componente LPPV en el mismo GameObject, o puede usar (pedir prestado) un componente LPPV desde otro GameObject utilizando la propiedad Proxy Volume Override. Si Unity no puede encontrar un componente LPPV en el GameObject actual o en un Proxy Volume Override GameObject, aparecerá un mensaje de advertencia en la parte inferior del Renderer.

Ejemplo

Un ejemplo de un Mesh Renderer simple utilizando un componente Light Probe Proxy Volume
Un ejemplo de un Mesh Renderer simple utilizando un componente Light Probe Proxy Volume

En la Escena de arriba, hay dos planes (planos) en el suelo utilizando Materials que emiten mucha luz. Tenga en cuenta que:

  • La luz de ambiente cambia a través de la geometría cuando utilice un componente LPPV. Utilice un Light Probe para crear un color constante en cada lado de la geometría.

  • La geometría no utiliza Static lightmaps, y las esferas representan Light Probes interpolados, estos son partes del Gizmo Renderer.

Cómo utilizar el componente

El área en la que se genera la cuadrícula 3D de Light Probes interpolados se ve afectada por la propiedad Bounding Box Mode.

Hay tres opciones disponibles:

Bounding Box Mode: Función:
Automatic Local (valor predeterminado) Se calcula un bounding box (caja delimitadora) de espacio local. Las posiciones interpoladas de los Light Probe se generan dentro de este bounding box. Si un componente Renderer no está adjuntado al GameObject, se generará un bounding box predeterminado. El cálculo del bounding box incluye el Renderer actual y configura todos los Renderers en la jerarquía que tienen la propiedad Light Probes en Use Proxy Volume.
Automatic Global Se calcula un bounding box que incluye el Renderer actual y todos los Renderers en la jerarquía que tienen la propiedad Light Probes configurada en Use Proxy Volume. El bounding box está alineado al mundo.
Custom Se utiliza un bounding box personalizado. El bounding box se especifica en el espacio local del GameObject. Las herramientas de edición de los bounding box están disponibles. Puede editar manualmente el volumen delimitador modificando los valores Size y Origin en la interfaz de usuario.

La diferencia principal entre Automatic Local y Automatic Global es que en el modo Automatic Global, el bounding box es más costoso de calcular cuando una gran jerarquía de GameObjects utiliza el mismo componente LPPV de un GameObject padre. Sin embargo, el bounding box resultante puede ser de menor tamaño, lo que significa que los datos de iluminación son más compactos.

La cantidad de Light Probes interpolados desde el volumen delimitante se afecta por la propiedad Proxy Volume Resolution. Hay dos opciones:

  • Automatic (valor predeterminado) - La resolución en cada eje se calcula utilizando la cantidad de Light Probes interpolados por unidad de área que usted específica, y el tamaño del bounding box (caja delimitante).

  • Custom - Le permite a usted especificar una resolución diferente en cada eje (mirar abajo).

Tenga en cuenta: La resolución final en cada eje debe ser un exponente a la dos, y el valor máximo de la resolución es 32.

Probe Position Mode especifica la posición relativa de un Light Probe interpolado en un cell center. Esta opción puede ser útil en situaciones en las que algunos de los Light Probes interpoladas pasan a través de paredes u otras geometrías y causan fugas de luz. El ejemplo siguiente muestra la diferencia entre Cell Corner y Cell Center en una vista 2D, utilizando una resolución de cuadrícula de 4x4:

Imágenes para comparación

  1. Un simple Mesh Renderer utilizando un Standard Shader:

    Con Light Probe Proxy Volume (resolución: 4x1x1)
    Con Light Probe Proxy Volume (resolución: 4x1x1)
    Sin Light Probe Proxy Volume
    Sin Light Probe Proxy Volume
  2. Un Skinned Mesh Renderer utilizando un Standard Shader:

    Con Light Probe Proxy Volume (resolución: 2x2x2)
    Con Light Probe Proxy Volume (resolución: 2x2x2)
    Sin Light Probe Proxy Volume
    Sin Light Probe Proxy Volume

Ejemplo de un Particle System Shader utilizando la función ShadeSHPerPixel

Shader "Particles/AdditiveLPPV" {
Properties {
    _MainTex ("Particle Texture", 2D) = "white" {}
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off
    
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_particles
            #pragma multi_compile_fog

            // Specify the target
            #pragma target 3.0
            
            #include "UnityCG.cginc"
            
            // You must include this header to have access to ShadeSHPerPixel
            #include "UnityStandardUtils.cginc"
                        
            fixed4 _TintColor;
            sampler2D _MainTex;
            
            struct appdata_t {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;                
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float3 worldPos : TEXCOORD2;
                float3 worldNormal : TEXCOORD3;
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {           
                half3 currentAmbient = half3(0, 0, 0);
                half3 ambient = ShadeSHPerPixel(i.worldNormal, currentAmbient, i.worldPos);
                fixed4 col = _TintColor * i.color * tex2D(_MainTex, i.texcoord);
                col.xyz += ambient;
                UNITY_APPLY_FOG_COLOR(i.fogCoord, col, fixed4(0,0,0,0)); // fog towards black due to our blend mode
                return col;
            }
            ENDCG 
        }
    }   
}
}

Requerimientos de hardware

El componente requiere al menos un hardware de gráficos Shader Model 4 y soporte de API, incluyendo soporte para texturas 3D con un formato floating-point de 32 bit y un filtro lineal.

Para que funcione correctamente, la Escena necesita que contenga Light Probes mediante los componentes Light Probe Group. Si un requerimiento no se cumple, el inspector del componente Renderer o Light Probe Proxy volume muestra un mensaje de advertencia.

Light Probes
Grupo de Luces de Sonda(Light Probe Group)