【译】LIGHT PROBE PROXY VOLUME:5.4版本功能展示

发表于2016-02-05
评论4 5.9k浏览

原文地址:http://blogs.unity3d.com/2016/02/03/light-probe-proxy-volume-5-4-feature-showcase/

原文作者未做版权声明,视为共享知识产权进入公共领域,自动获得授权

 

UNITY即将推出Light Probe Proxy Volume(LPPV)功能。我将介绍下这个功能是什么、工作流以及一些使用的体验。

Light Probe Proxy Volume是什么?

LPPV是一个让那些不能使用烘焙光照贴图的动态物体使用更多光信息的组件,比如蒙皮或者粒子系统。是的!粒子系统可以通过这个组件得到烘焙的光照信息!

 

 

 

怎样使用LPPV组件

LPPV依赖于Light Probe Group.可以在Component -> Rendering -> Light Probe Proxy Volume下找到,默认情况下是这样:
Light Probe Proxy Volume Component_1


它是一个需要添加到GameObject上的组件,像添加Mesh或者Light Probe Group组件一样。你希望用LPPV影响的GameObject需要有一个MeshRenderer / Renderer组件,并且把Light Probes属性设置为” Use Proxy Volume”:

Light Probe Proxy Volume Component_3

你可以浏览其他使用Proxy Volume覆盖的GameObjectLPPV组件的设置,把属性拖拽到你希望改变的Renderers上。

Use Proxy Volume






设置包围盒:


设置包围盒有三个选项:


l  AutomaticLocal


l  AutomaticWorld


l  Custom


Automatic Local:


这是默认属性设置,包围盒的计算是在Local空间内。包围盒需要包围所有使用Use Proxy Volume的子物体的Light ProbesAutomatic World也是这样。

Light Probe Proxy Volume Component_1



Automatic World:


包围盒是在世界坐标中进行计算的,这个模式与Automatic Local的区别在于Automatic Local在面对比较多的继承关系时候需要花费更多的时间来计算,但是计算出来的包围盒会更小进而光照数据也更小。


Custom:


这种模式可以使得你在UI中制定包围盒的起点和大小。包围盒是在GameObject的局部空间中设定的。你需要确保所有的renderer在包围盒内。

Light Probe Proxy Volume Component



Interpolating Probes


使用LPPV的性能测试


4GhzCPU上,对一批64light probe进行插值大概需要1.5ms。对light probe的插值可以是多线程的,如果数目少于64个将只在主线程进行插值。

使用Unity内置的调优器,你将在主线程里面看到BlendLightProbesJob。如果你把light probe的数目设置为超过64个,那么你将在工作线程里面也看到BlendLightProbesJob

BlendLightProbesJob




硬件要求:


这个组件需要显卡支持Shader Model 4以及支持32位浮点格式的3D纹理以及线性滤波。


 


粒子系统中使用ShadeSHPerPixel功能的示例Shader


标准Shaders已经支持此功能,如果你希望把ShadeSHPerPixel功能加到定制的shader里面。请查看下面的例子来看下如何使用此功能:



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
            // Don’t forget to specify the target
            #pragma target 3.0
 
            #include "UnityCG.cginc"
            // You have to 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
         }
      }
   }
}











如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引