【译】光照探头代理体:Unity5.4功能展示

发表于2016-02-23
评论1 3.1k浏览

  Unity5.4已经进入测试阶段,其中一个显著的特点就是光照探头代理体 (LPPV) 。我想跟大家分享一下它是什么、并做一些小的实验来展示它的工作流程。

在2016年1月30日Unity测试期间更正了主题的变化

 

什么是光照探头代理体?

  光照探头代理体是一个很多不能使用烘焙贴图的光线信息能够在大的动态对象中使用。想像一下蒙皮的网格或者粒子系统,是的,粒子系统接收烘焙的灯光信息,真棒!

               

如何使用LPPV组件呢? 

  LPPV组件需要现成的光照探头组,这个组件的位置在组件->渲染->光照探头代理体,默认情况下,该组件是这样的:

 


  这是你需要添加到游戏对象里的组件,例如3D模型,或者只是一个光照探头代理体。如果你想用LPPV来优化游戏对象,那你则需要网格渲染器/有光照探头代理体功能的渲染器要设置“使用代理体”:



你可以使用代理体覆盖来从另一个游戏对象中借出它现有的LPPV组件,只需要针对你想使用的每个渲染器,将其拖动并放在合适的功能位置。举个例子:如果你向光照探头组对象里添加LPPV组件,之后你就可以通过代理体覆盖功能共享所有的渲染器了。

             


建立边界框:

以下有3个选项供你建立你的边界框:

自动本地

自动世界

自定义

 

自动本地:

  默认属性设置-边界框在局部空间内计算,插入的光探头将在边界框内部产生作用。边界框的计算加入了当前的渲染器,所有分层之下具有光探头功能的渲染器都设置“使用代理体”,自动世界同样如此设置。


             


自动世界:

  计算均衡世界的边界框,自动全球和自动本地的选项在其他的渲染器上需要和代理体覆盖结合使用。你可以将使用同一LPPV组件的游戏对象设置为同一父层次。

  该模式与自动本地模式的区别就在于,在自动本地模式中当一组庞大的、来自于同一父对象、使用同样LPPV组件的对象计算边界框更麻烦、成本也更高。但是这样计算出来的边界框在尺寸上也会更小,这也意味着光照数据更加精细。

 

自定义:

  使得你可以在用户界面里自己编辑边界框的大小,可以在Inspector工具里改变大小和初始值,或者使用工具编辑场景视图。边界框被限定在游戏对象的局部空间中。你则需要确保所有的渲染器都是在LPPV的边界框之内。


             

 

设置分辨率/密度

  在设置好你的边界框之后,你需要考虑代理的分辨率和密度。在分辨率模式下有两个选项可供你设置:

 

自动:

  默认属性设置-设定一个密度值,即每单位的探头数量。每单位的探头数量用X,Y,Z轴来计算,因此可以用边界框的尺寸来定义.

 

自定义:

  使用下拉菜单中的X,Y,Z轴来设置自定义分辨率的值,值从1开始,可以递增到2直到32,你可以使用32*32*32的插值探头。


             


使用LPPV时要考虑到性能测试:

  请记住每一批64个插值光探头的插值在i7—4Ghz 的CPU里将耗时大约0.15毫秒(分析期间),光探头的插值必须是多线程的,任何低于或等于64插值的光探头都不会是多线程的并且只能在主线程上运行。

  使用Unity内置的分析器,你可以在主线程上使用时间轴工具看到BlendLightProbesJob,如果你增加插值光探头的数量使它超过64,你将也能在其他的线程看到BlendLightProbesJob。


             


  一批64插值的光探头将只能在主线程上运行,而如果有很多批多于64插值的光探头那,它将分配一个在主线程运行,其他的放在工作线程上运行,但这仅仅适用于一个LPPV组件。如果你有很多个少于64个插值光探头的LPPV,他们讲都能在主线程上运行。

 

硬件要求:

  该组件将至少需要支持Shader Model4图形硬件和API支持,还要支持具有32位浮点格式和线性滤波的3D纹理。 

  使用ShadeSHPerPixel功能的粒子系统着色器的示例:

  标准的着色器支持此功能,如果你想使用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

// 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;

structappdata_t

{

float4 vertex : POSITION;

float3 normal : NORMAL;

fixed4 color : COLOR;

float2 texcoord : TEXCOORD0;

};

structv2f

{

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);

returno;

}

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

returncol;

}

ENDCG

}

}

}

}

 

  翻译自:< LIGHT PROBE PROXY VOLUME: 5.4 FEATURE SHOWCASE / http://blogs.unity3d.com/2016/02/03/light-probe-proxy-volume-5-4-feature-showcase/>

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

 

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