作者:CHRISTOPHER POPE
原文連結

Unity 5.4進入到Beta的階段。当中一個特別的功能是光照探頭代理Light Probe Proxy Volume(LPPV)。本篇會向大家介紹什麼是LPPV,並介紹它怎样運作



對Unity5.4beta有興趣能够從這裡下載,必須有Pro的序號才干使用。

什麼是光照探頭代理


LPPV是一個能幫無法用烘焙光照的超大動態物件(Dynamic object)把很多其它光照資料轉出的元件,像是皮網格或者粒子系統。沒錯! 代表烘焙光照能烘粒子系統的資訊。讚吧?









怎样使用LPPV元件





使用LPPV元件必須要跟著一組光探頭組(Light Probe Group)。能够從 Component -> Rendering -> Light Probe Proxy Volume找到它,在預設情況下。這個元件看起來是這樣:





這個元件须要加到像是有網格甚至光照探頭組的遊戲物件中,想要用到LPPV的物件须要有MeshRenderer或者Renderer元件。並將Light Probes屬性設為“Use Proxy Volume”。





你能够透過指定Proxy Volume Override來使用其他GameObject上的LPPV元件。仅仅需拖放這個物件到不论什么你想要使用它的Renderer元件的屬性裡。




比如:將LPPV元件加到光照探頭組物件中,那麼你就能够透過Proxy Volume Override屬性在全部Renderer元件中共用它:


設定邊界:


邊界的設定有三個選項:
  • Automatic Local
  • Automatic World
  • Custom


Automatic Local:預設屬性,邊界會在本地空間內計算,插值光探頭位置將在這個範圍內產生。計算包括Renderer和它底下階層全部有設定Use Proxy Volume的Renderer元件,Automatic World也是一樣算法。


Automatic World:會計算對齊世界坐標軸的邊界。

這兩種選項應該與Proxy Volume Override屬性配合使用在其他的Renderer元件上。另外你也能够將同一個LPPV元件指定到最上層的父物件來使全部下層的物件使用這個LPPV元件。



World和Local的區別在於,在Local模式下當一個階層太多的子物件嘗試使用父物件的LPPV元件會在計算邊界時比较耗效能,但計算出來的邊界尺寸也許會更小,那麼光照資料就會更確實。




Custom:這個模式能用工具來自訂邊界,從場景裡直接編輯或是從inspector介面來改动大小。這個模式邊界是在物件的本地空間中設定的,所以你须要確定全部帶有Renderer元件的物件都要在LPPV的範圍內。


設置解析度/密度:

設定完邊界之後,你還须要考慮代理的密度和解析度。在Resolution Mode底下有兩個選項:




Automatic:自動 - 預設屬性。用來給密度設定一個值,比如每單位的探頭數量。每單位在X,Y,Z軸上的探頭數量計算,數量取決於邊界大小。

Custom:自訂 - 用下拉式功能表來設定X,Y,Z軸上解析度的值。值從1开始以2的次方遞增最大到32,所以你最多能够有32x32x32 個內插(Interpolation)探頭





使用LPPV時效能的考量:

請記住每批64個內插光探頭的內插計算大概须要0.15毫秒的CPU運算(i7-4Ghz)(用Profiler觀察的數據)。光探頭內插計算能够是多執行緒的,但不论什么小於或等於64個內插光照探頭不會用多緒而仅仅在主執行緒中執行。




所以當你使用Unity內建的Profiler在Timeline視圖你會看到BlendLightProbesJob在主執行緒上,假设你將內插光探頭數量添加到超過64個,你就會在工作執行緒上看到BlendLightProbesJob:






當仅仅有一批次的64個內插光探頭時將仅仅會在主執行緒上計算,當有多個批次(大於64)的時候仅仅會在主執行緒上計算一批,其他的會分配到工作執行緒上。但這個行為仅仅針對單個LPPV。

假设你有多個LPPV,並且都少於64個內插光探頭的話。那他們都會主執行緒上運作。

硬體需求:


要讓這個功能運作须要至少支援Shader Model 4的硬體以及相對的API支援,包含支援32位元浮點格式以及線性過濾的3D材質。

使用ShadeSHPerPixel的粒子系統著色器的範例:

Unity的標準著色器是支援這個功能的。但假设你想使用自訂Shader。能够用ShadeSHPerPixel函式。

這個範例說明怎样使用這個函式:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
         }
      }
   }
}

淺談Unity 5.4新功能:Light Probe Proxy Volume的更多相关文章

  1. Light Probe Proxy Volume

    [Light Probe Proxy Volume] The Light Probe Proxy Volume (LPPV) component allows you to use more ligh ...

  2. Unity User Group 北京站:《Unity5.6新功能介绍以及HoloLens开发》

    ​时间一转眼从春天来到了初夏,Unity User Group(以下简称UUG)活动也迎来了第七期.我们面向Unity3D开发从业者以及未来想从事Unity3D开发的学生群体的UUG活动这次仍然在海淀 ...

  3. unity5.0新功能

    原作者 只待苍霞 章节1: 先来两个最关心的新功能, 第一章先讲PBS, 第二章讲光影GI.说到PBS, 首先应该想到的是Unity自带的两个新的Shader, 分别是Standard以及Standa ...

  4. unity5.0新功能-布料、动画系统

    原作者:只待苍霞 这一章讲一下布料系统, 这次的布料系统有很大的改良.Unity4中, 需要对SkinnedMeshRenderer使用SkinnedCloth, 或者对Cloth Renderer使 ...

  5. Unity5 新功能解析--物理渲染与standard shader

    Unity5 新功能解析--物理渲染与standard shader http://blog.csdn.net/leonwei/article/details/48395061 物理渲染是UNITY5 ...

  6. 看了一下unity5.6的新功能 以及Timeline

    3月31日unity5.6发布,然而timeline(前sequence模块)被delay到unity 2017.上个星期官方又发布了unity 2017的beta版本 抽空看了下 (unity5.6 ...

  7. 【Linux】Ubuntu18.04镜像下载,新功能介绍

    一.Ubuntu18.04镜像下载 官方下载地址:http://releases.ubuntu.com/18.04/ 官方64位iso下载地址:http://releases.ubuntu.com/1 ...

  8. 代码演示C#各版本新功能

    代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...

  9. 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能

    前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...

随机推荐

  1. 动态代理(jdk--cglib)

    JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类 ...

  2. ajax --- 解决ajax跨域请求导致session失效的问题

    起因:http是无状态的,因此我们通常需要用到cookie以及session来保存状态,session是在服务器端存储的,会和cookie一起使用,设置了session之后,会发送给浏览器一个cook ...

  3. phpMyAdmin出现找不到mysql扩展和Cannot log in to the MySQL server问题

    环境:Centos6.5,Apache2.4, PHP5.5, MySql5.6. phpMyAdmin版本:https://files.phpmyadmin.net/phpMyAdmin/4.4.1 ...

  4. 基于Linux下Iptables限制BT下载的研究

    基于Linux下Iptables限制BT下载的研究   摘要:     当前BT下载技术和软件飞速发展,给人们网上冲浪获取资源带来了极大的便利, 但同时BT占用大量的网络带宽等资源也给网络和网络管理员 ...

  5. linux RAC 安装失败完全卸载

    1,删除软件安装目录 rm -rf /u01/app 2,删除以下目录内容 rm -rf /tmp/.oracle rm -rf   /tmp/* rm -rf   /tmp/ora* rm -rf ...

  6. javaScript 原型与原型链学习笔记

    javaScript中,原型是常用到一种方式,它能降低储存占用,写出更高效的代码 原型常用到的则是prototype属性 JavaScript prototype 属性 定义和用法 prototype ...

  7. unzip---解压缩“.zip”压缩包。

    unzip命令用于解压缩由zip命令压缩的“.zip”压缩包. 语法 unzip(选项)(参数) 选项 -c:将解压缩的结果显示到屏幕上,并对字符做适当的转换: -f:更新现有的文件: -l:显示压缩 ...

  8. 51nod 最大子段和问题

    给出一个整数数组a(正负数都有),如何找出一个连续子数组(可以一个都不取,那么结果为0),使得其中的和最大? 用f[i]表示以i为结尾的最大字段和,也就是说i一定要取, 那么f[i] = max(a[ ...

  9. 【Uva 10723】Cyborg Genes

    [Link]: [Description] 给你两个串s1,s2; 让你生成一个串S; 使得s1和s2都是S的子列; 要求S最短; 求S的不同方案个数; [Solution] 设两个串的长度分别为n1 ...

  10. RocketMQ 就是耗内存

    http://blog.csdn.net/loongshawn/article/details/51086876 https://rocketmq.incubator.apache.org/docs/ ...