作者: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. Domino服务器SSL的配置录像

    Domino服务器SSL的配置录像 格式:avi, 大小:25M 时长: 6分钟 本文出自 "李晨光原创技术博客" 博客,转载请与作者联系!

  2. android开源项目---View篇

    本文转载自:http://blog.csdn.net/likebamboo/article/details/19080739 主要介绍那些不错个性化的View,包括ListView.ActionBar ...

  3. android图片资源的适配问题

    原文: http://hi.baidu.com/weiyousheng/blog/item/c622d701b9dec6c2277fb5cc.html 在之前的版本中,只有一个drawable,而2. ...

  4. selenium与phantomjs简单结合

    selenium工具安装 Windows安装pip install selenium Linux安装apt-get install selenium 查看selenium支持的浏览器from sele ...

  5. JS的解析与执行过程—全局预处理阶段之全局词法环境对象

    问题:有如下代码 var a = 1; function pop() { alert(a); var a = 5; } pop();//执行结果,弹出undefined 这段代码的执行结果为undef ...

  6. vuex requires a Promise polyfill in this browser.--ie-vue-兼容处理日记

    1.ie9+报错vuex requires a Promise polyfill in this browser. 解决如下: npm install --save-dev -polyfill 修改c ...

  7. K-近邻算法学习

    # -- coding: utf-8 -- from numpy import * import operator def createDataSet(): group = array([[1.0,1 ...

  8. 获取cpu使用率

    http://blog.csdn.net/u010515761/article/details/43225621 http://stackoverflow.com/questions/74674/ho ...

  9. (七十一)关于UITableView退出崩溃的问题和滚动究竟部的方法

    [TableView退出崩溃的问题] 近期在使用TableView时偶然发如今TableView中数据较多时,假设在滚动过程中退出TableView到上一界面.会引起程序的崩溃.经过网上查阅和思考我发 ...

  10. pat(A) 1065. A+B and C (64bit) (java大数)

    代码: import java.util.*; import java.math.*; public class Main { public static void main(String args[ ...