unity的平行光有啥办法可以只照射一些区域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity的平行光有啥办法可以只照射一些区域相关的知识,希望对你有一定的参考价值。

给想照射的物体填加layer区分,然后用culling mask选中.

这样,除了添加的layer,其他的都照射不到了

参考技术A 试一下改变光照方向;或者使用阴天效果。。。
---------------------------------------Unity5实用教程:光照技术的使用技巧
unity5中的光照主要分6个部分来讲解。

Forward(前向)与Deferred(延迟)渲染Realtime(实时)与Baked(烘焙)光照引擎的光照工具光照场景性能技巧后期处理

上述的大部分对于Unity制作的内容都是适用的,并不局限于虚拟现实应用。这是非常高级的内容介绍,需要读者具备基础的图形和光照的概念。下面开始吧!

前向与延迟渲染通道

如果心怀疑虑,请使用前向渲染通道。前向渲染通道对VR应用来说很理想,有以下几点原因。前向渲染在前期的性能开销较低,DrawCall较少更宜在CPU运行,在移动VR设备上也同样运行的很好,它还支持抗锯齿和半透明材质。以下是能帮助你决定应用适用渲染管线的简单指南。

延迟渲染

延迟渲染前期的性能开销很大,但它是一个固定的性能开销,添加再多的几何体和灯光也不会产生过多的额外开销。你有几百个实时灯光?那就使用延迟光照吧。延迟光照的开销是与灯光照亮的像素数量成正比的。场景复杂度(灯光照亮的物体数量)并不会影响性能。旁注:UE4 只有延迟渲染管线,这就是UE4制作的Demo在较老的PC上运行缓慢的一个原因。

优点

延迟渲染最适用于包含大量小体积实时灯光的场景。

每个光照都可以当作一个逐像素灯光来渲染,以便在法线和深度贴图中可以精确着色。

每个光照都有一个实时阴影。

权衡

延迟渲染器无法渲染半透明材质。你需要为半透明材质添加一个额外的前向通道。

平行光在延迟渲染器中开销很大。它们影响整个场景,且光照体积无限大。

产生大量Draw Call(场景中每个物体产生的两个Draw Call乘以每个灯光产生的两个Draw Call。)

不能抗锯齿(这对于VR非常不利,因为VR极度依赖MSAA来减少闪烁和忽隐忽现的线)。

前向渲染

前向渲染的前期固定开销较小,因而最适合复杂度较低的场景,但其性能开销与场景复杂度成正比。如果你的场景中只有一对实时灯光,那就使用前向渲染吧。前向渲染器的成本与场景中灯光的数目成正比。像素灯越少则性能越高。

权衡

在每个渲染通道中,每个被像素灯光照到的对象都会被渲染。如果一个对象被10盏不同的灯光照亮,那它将被渲染十次(每个光照通道一次)。这就是前向渲染通道中被灯光照亮的物体越少越好的原因。

从设计上限制灯光数量。

基本通道用实时阴影渲染一个方向光,并用额外的通道来渲染其余的灯光。然而,这些额外的灯光不会有阴影。

像素光照数量有限,其余的都是顶点光照。和逐像素光照对象相比,顶点光照提供的效果较简单。

好处

Draw Call较少。每次像素光照射到物体,就会产生一次Draw Call。最坏的绘制调用计数情况是(场景中对象数量*照射到对象的像素光数量)。有很多降低Draw Call的方法(批处理等)锯齿(8XMSAA,非常适合VR)支持半透明材质如果你的目标平台是移动端(如GearVR),使用前向渲染通道,限制像素光数量为1~2个

当在前向和延迟渲染间犹豫不决时,别忘了我们这里只讨论实时灯光。场景中有多少烘焙光照都是可以的。烘焙光照贴图,并在运行之前禁用它们。运行时渲染器只会考虑场景中的实时灯光。

实时和烘焙光照

如果你在乎阴影的真实,那就烘焙灯光。硬阴影或者软阴影在一些情况下已足够,但在很多情况下仍不能接受。(比如桌子上的点光源)。在实时光照下,你可以在地面上看到块状阴影。在烘焙光照下,你看见的是一个柔和的,散布在桌下的阴影。实时灯光只在光照有变化(颜色,位置等等)的情况下是必要的。烘焙光照和阴影不会随着实时移动的对象而改变,但可以用小技巧来弥补。(见下面的“光照探针”)。

提高烘焙光照贴图质量

在烘焙时,你可以通过增大烘焙分辨率滑动条(合理的纹理像素分辨率是40~100)来提高光照贴图质量。启用环境光遮蔽(Ambient Occlusion)和最终聚集(Final Gather)。在烘焙之前,检查工程的Quality 和Player 设置。在Quality选项卡中,使用高分辨率的硬阴影和软阴影。在Player选项卡中,选择延迟渲染器。在烘焙前禁用GI预计算。即使使用质量较低的阴影,在运行时采用前向渲染,采用这些设置会使烘焙期间效果达到最好。你可以在烘焙完成后切回前向渲染或低图形质量。

引擎灯光工具

区域光源

可以改变位置和旋转。必须烘焙。注意:镜面反射显示在表面的单一区域,与该区域光的大小和形状无关。用于窗口和盒状的灯光(壁顶灯或灯管)。

点光源

可以调整位置,但旋转无效。一个光秃秃的灯泡,会向各个方向散射光线。用于普通的灯泡环境。

聚光灯

可以设置位置和旋转。用于手电筒,泛光灯,和天花板灯等。

方向光

位置无关紧要,但可以旋转。灯光影响整个场景(但可以被屋顶遮挡,这与环境光不同)使用方向光模拟户外太阳或者月亮光,或者创建一个室外灯光通过天窗来照亮室内场景。方向光非常粗糙,产生的阴影也是生硬的。

环境光

会微微照亮整个场景(颜色可选)这意味着即使未被照亮的区域也会有一丝光线如果希望未照亮区域完全不可见,就要禁用环境光。使用环境光来改变场景氛围。

全局光照

全局光照是为了实现更具有真实感的场景而计算来自直接光照的简单反射光和阴影。实时全局光照支持改变场景灯光,比如改变灯光颜色,移动直射的太阳光,从白天过渡到黑夜等等。为了提高实时全局光照的质量,增加预计算的分辨率。

光照探针

如果使用烘焙光照,那动态对象就不会有精确的阴影和光照信息。它们看起来很呆滞。使用Light Probes来添加真实感光照,阴影并为动态物体着色。它是预计算的光照信息卷积,可以作用于移入和移出此区域的物体,以较小的代价模拟实时光照。

光照探针用球面调和(SH)模型来存储光照信息。前向渲染器的基本通道渲染像素灯光和所有的SH灯光。这样一来,每个光照探针的CPU开销很小,也不会产生GPU开销。点此了解更多内容。

反射探针

对于镜子或镜面屏这样的反射表面,你需要在此表面上看到周围物体的倒影。这可以用一个反射探针简单的实现。可惜目前只能是立方体形状,最适用于立体房间。对于有动态对象的场景,你可以使用实时反射探针。对于静态场景(或为了降低性能开销),可以使用烘焙反射探针。

反射探针使用长方体投影精确模拟诸如大理石地板上的窗户倒影。立方体本身不会精准反射,而长方体的反射贴图可以解决这个问题。自定义立方贴图可以做更加逼真的“波浪”反射(例如在大理石地板上)。

自发光光照

在一个有灯罩的台灯场景中,灯罩上必须有自发光纹理。它将使灯罩显得明亮,对周围环境有柔和的光照。在里面还需放置一个点光源,使得台灯顶部和底部都能发出更清晰更明亮的光。这些光应该会被灯罩遮挡,因此这些光将会以双重锥体形状从灯罩中射出。区域光会有更好的阴影,但自发光贴图有成形的光(并因此产生有形状的反射)

照明场景

天花板灯光(管状或盒状灯)

可以利用标准着色器的自发光属性来实现带状和盒状灯精确而柔和的灯光。你可以使用区域光或自发光材质,或两者结合。天花板上的灯管可能在你直视它的时候发出明亮的光。在管状灯的各个灯管上使用自发光材质。用区域光来实现管状灯实际产生的灯光,实现带有更好的半影效果的阴影。

窗户

对场景的曝光控制和有限的眼睛动态范围,意味着在远离窗口时,室内应正确曝光,但窗口应该被表现出来,展现出明亮的光线和柔和的阴影。这可以通过HDR到LDR色调贴图来实现。当玩家从黑暗的室内移动到明亮的室外场景时,场景的曝光也会随之改变。

使用彩色纹理的窗户(例如:教堂的窗户)可以使用Cookie在地板上投射图案,但Cookie是没有颜色数据的灰度Alpha通道。这很棘手,需要一些黑科技

阴天

在一个阴天的户外场景,直射的“太阳”在通过云层时散射后产生的光线比较柔和。方向光可能不适合,因为它们产生的阴影非常生硬。可以考虑使用浅灰色的环境光,和充满乌云的天空盒立体贴图以及点光源来营造阴郁的光线和阴影。

云隙光

云隙光也被称为阳光光束或灯光轴,这在VR中效果很好,尤其是结合浮尘粒子。它的计算量很大,但Robert Cupisz正致力于实现一个轻量的灯光轴。unity的Asset store上有很多解决方案,但我还没有试过,所以这里没什么建议。

提高性能

以下是一些提高性能的技巧:

降低眼睛的渲染目标纹理分辨率。这是提升性能最简单,最直接的方式。烘焙光照贴图可以搞定一切?几何体、灯光,和材质越多,会导致烘焙时间越长。将场景划分为多个层次,并分别加载它们。这能大大减少加载所需资源而占用的内存量,移动平台的内存限制非常关键。使用前向渲染?尽量少用像素光。这可以在项目的Quality设置菜单进行更改。实时光照开销很大。尽可能多使用烘焙光照并在运行之前禁用它们。光照探针(球面谐和灯)的CPU开销很小,且没有GPU的开销。这是预先计算和模拟实时阴影的简便办法,而无需使用实时灯光。

旁注:VR中的灯光闪烁?

如果你的灯光在一只眼中闪烁(VR的左、右镜头),Unity会剔除灯光。我认为这是一个Bug。解决方法:将灯光标记为重要,这样引擎就不会禁用它了。记住,你也可以根据需求用代码来启用或禁用场景中的灯光,这样就能完全控制。

后期处理和关卡设计

设计真实感的光照时,场景的对比度要很高:明亮的区域,正确的阴影,以及黑暗的区域。不要照亮整个场景(例如环境光),否则将出现面片和游戏那样不真实的场景。

破坏阴影(即让阴影区域更加黑暗,几乎没有任何细节)是比较理想的现实。可以避免那种扁平的效果。

同样,要小心强光使一些区域过度曝光。

查找纹理(LUTS)

左:中性 右:标准 “平衡对比度”纹理可以通过PhotoShop添加色调与色彩校正,修改阴影,曝光一些区域,并应用PS校正场景的每一帧。用一个非常简单的LUT来彻底改变一个沉闷的场景,使其有完全不同的氛围

这是一个快速简单的后期处理技术,可以带来截然不同的效果。本回答被提问者采纳

Unity基础(四)Unity灯光

参考技术A       灯光是游戏场景的重要组成部分,决定你的3D环境的颜色和氛围。通过相互搭配,让场景更加层次分明、光彩绚丽。

       Unity中的光源有四种类型:Directional Light(平行光)、Point Light(点光源)、Spot Light(聚光灯)、Area Light(区域光)。

       1、Directional Light 平行光/方向光/定向光: 平行光的光线是互相平行的,不管对象离Directional Light光源多远,它投射出来的阴影看起来都一样,而且Directional Light没有真正的光源坐标,把它放置在场景任何地方都不会影响光照效果,只有旋转会影响Directional Light的照射结果。平行光影响场景的所有物体,类似于自然界中太阳光的照明效果。通常用于(室外)模拟太阳光,它的特性就像是个太阳,可以被放置在无穷远的地方,能从无限远的距离投射光源到场景。

      在Unity里Directional Light还会与天空盒系统(程序天空盒)关联,就是把Directional Light做为太阳显示并绑定在天空壳上。指定路径(Window->Rendering->Lighting settings(打开Lighting菜单)->Scene->Sun Source)。

       2、Point Light 点光源: 点光源向四面八方(所有方向)发射光线,影响其范围内的所有对象,亮度从中心往外递减到0为止,类似灯泡的照明效果。适合用来制作像灯泡、武器发光或爆炸等效果。点光源的阴影为了要给六个不同的世界方向会运算六次,因此点光源的阴影运算是很图像处理器资源的,必须谨慎使用。注意:目前点光源不支持阴影的间接反射,这就表示由点光源产生的光线,只要在距离内有可能会穿过对象反射到另外一面,这可能会导致墙壁或地板 漏光 ,因此放置点光源要格外注意,然而如果是采用Backed GI的话,就不会有这类的问题产生。

        3、Spot Light 聚光灯: 聚光灯从光源发出,在一个方向上按照—个锥形的范围发射光线,该锥形是由聚光灯角度 (Spot Angle) 和范围 (Range) 界定的,光线会从源头到设定的范围慢慢衰减到0。类似手电筒, 路灯, 壁灯,舞台灯光等等照明效果。因为投射区域能精确的控制,因此很适合用来模拟打在角色身上的光。 聚光灯也是比较耗费图形处理器资源的。

       4、Area Light 区域光/面光源 :这种光能从各方向照射一个平面的矩形截面的一侧。该光源无法应用于实时光照,仅适用于光照贴图烘焙 lightmap baking, 

Type 类型: 灯光对象的当前类型

Color 颜色: 光线的颜色

Range 范围: 点光源/聚光灯有这个属性

Spot Angle(聚光灯角度): 聚光灯的角度

Mode 模式: 【Realtime 实时; Mixed 混合; Baked 烘培】

Intensity 强度: 光线的明亮程度

IndirectMultiplier 间接光强度

ShodowType 阴影类型(是否开启阴影): 【No Shadows 无阴影;Hard Shadows 硬阴影:锯齿强度比较明显;Soft Shadows 软(柔和)阴影:软阴影效果比硬阴影效果好,但是耗费性能。】

      Strength 硬度: 阴影的黑暗程度,取值范围是在0和1之间。

      Resolution 分辨率: 阴影的细节水平

      Bias 偏移: 用于比较灯光空间的像素位置与阴影贴图的值比较的偏移量。当值太小时,物体的表面会有来自于自身的阴影,物体就像长了痘痘一样。当值太大,光源就会脱离了接收器(彼得平移)。影子显示错位时调整。

Cookie(Cookie投影): 以纹理的Apha通道作为一个遮罩,使光线在不同的地方有不同的亮度。如果灯光是聚光灯或方向光,这必须是一个2D纹理;如果灯光是一个点光源,它必须是一个立方图(Cubemap)。

Cookie Size(缩放Cookie投影): 只用于方向光。

Draw Halo 绘制光晕: 如果勾选此项, 光线带有一定半径范围的球形光晕被绘制。

Flare:耀斑/光晕/眩光: 光晕对象是被镜头光晕组件( Lens Flare Components)使用的源资源。光晕本身是一个纹理文件和具体的信息的结合,确定眩光的行为。然后,当你想在一个场景中使用眩光,将镜头光晕(Lens Flare)组件贴到一个游戏物体上,并拖动你要使用到镜头光晕的耀斑属性的耀斑,就像给网格渲染器( Mesh Renderer)指派一个材质(Material )一样。

Render Mode 渲染模式:

      Auto 自动:

      Important 重要: 灯光逐个像素渲染。只用在一些非常重要的效果(比如玩家的车的车头灯)。

      Not Important 不重要: 灯光总是以最快的速度渲染。顶点/对象光模式。

Culling Mask 消隐遮罩: 有选择地使组对象不受光的效果影响

Lightmapping 光照贴图: 仅灯光实时计算(RealtimeOnly)、自动(Auto)、烘焙( BakedOnly)

指定位置Edit -> Project Settings -> Player -> Other Settings。

以上是关于unity的平行光有啥办法可以只照射一些区域的主要内容,如果未能解决你的问题,请参考以下文章

三维模型平行光照射实现(WebGL进阶02)

三维模型环境光照射实现(WebGL进阶03)

使用Unity时打开C# 弹出opening visual studio一直停在这个界面是啥情况?有啥办法解决?

Unity基础(四)Unity灯光

Unity LayerMask

[image]30 unity导出WEBGL在浏览器打开很慢,有啥办法可以解决一下这个问题吗