2018-05-26 23:32:46 ChinarCSDN 阅读数 1145
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity4大光源之点光源


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



Chinar —— 心分享、心创新!

助力快速理解 Unity 提供的 4 大光源之一点光源系统

为新手节省宝贵的时间,避免采坑!


Chinar 教程效果:



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Point Light —— 点光源


Unity 提供的一个模拟灯光效果的光源

这是从一个点,向四周发射的一个光源效果

废话不多说直接看图,一目了然!

举个栗子黑白88
这里写图片描述


2

Range And Color —— 光源范围和颜色


值越大,球体越大

点光源的中心光照效果就越大,所以看着就跟亮度提高了一样

颜色控制不用多说,设置什么出什么光照颜色
举个栗子黑白88
这里写图片描述


3

Intensity and Shadow ——光源强度和阴影


Intensity :值越大,光源亮度越高

Shadow Mode:3种

无阴影、硬(阴影锐化)、软阴影(阴影柔和)
举个栗子黑白88
这里写图片描述


4


光照出来的纹理样式,需要对应透明通道的纹理材质!

就是现在很多商店做的效果,让光从纹理中照射出来,会有纹理效果

类似于 聚光灯中的 Cookie
举个栗子黑白88
这里写图片描述


支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!


先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !





技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址
>

2013-01-19 16:55:08 wxg694175346 阅读数 6953
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

阴影在3D游戏中是非常重要的一个细节,所以这一章我们专门介绍如何给物体添加阴影效果。

我们在运行前面的Demo的时候会有一种感觉,就是经过大树的时候会有阴影投射到方块上。

那么下面就来介绍一下如何给方块添加阴影。

灯光是阴影产生的一个非常重要的要素,

默认的灯光的ShadowType是NoShadows:


将其选中SoftShadow便可以产生柔和的阴影效果

选中HardShadow阴影边界则更为明显:

这个根据需要自行调整。

在方块周围放上树木,那么树木也会产生阴影:



至此,简单的阴影设置便完成了。

2019-12-14 17:11:24 cgy56191948 阅读数 29
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

面积光是具有形体的一类光源,不像点光源和平行光这类完全抽象化,没有形体的光源。面积光适用于表达柔和的自然光,如通过灯发出的光具有明显的几何形体光源。unity实现了面积光,但仅用于灯光烘焙,而在实时渲染中仍然无法使用面积光。下面将通过着色器计算来实现面积光。

一、线光源

1.1点、线、面

两个点可以确定一条直线,而两个相互垂直的线段可以确定一个矩形,6个面可以构成一个立方体。而这里,对面光源的构造也将从一条线段开始,也就是所谓的线光源。

1.2如何理解一个线光源

如何看待一个线光源,决定了如何在着色器代码中实现对线光源的计算。线光源的形体特征有两点:一个是长度,另一个是方向,即两端点所确定的直线的方向。线光源的光源照明特性如下:

线光源照明的物体其实处于从线光源的形体划分出来的3个几何空间内,处于两端点之外的点受到的照明是点光源的照明,而处于线段之内的空间的物体所受到的照明,则和物体到线段的垂直距离,以及垂足上的光源强度相关。

因此在实现中,也要分两部分来做,首先通过脚本传递几个数据到着色器中,分别是线段的长度,位置和方向。其次,在着色器计算即将被着色器的点处于线段所划分出的几何空间的哪一部分内。

1.3通过脚本传递线光源的几何信息

public class LineLit_1 : MonoBehaviour {
    public Transform lit;
    public Material mat;
	void Update () {
        mat.SetVector("litP", lit.position);
       // mat.SetVector("litN", lit.forward);
       // mat.SetVector("litR", lit.right);
        mat.SetVector("litT", lit.up);
	}
}

这个脚本只传递了物体的位置和方向到着色器中,而光源的长度则是着色器的属性提供的。

1.4计算光源的照明

在脚本中已经得到了光源的关键几何数据,接下来将在着色器中计算线光源对某一点的照明。代码如下:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Tut/Shader/Area Lit/LineLit_1" {
	Properties{
		lh("Height of Line light",range(0,4))=1   //线光源长度
		li("Intensity of Light",range(0,20))=1     //线光源强度(宽度)
	}
	SubShader {
		pass{
		Tags{ "LightMode"="ForwardBase"}
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#pragma multi_compile_fwdbase
		#pragma target 3.0
		#include "UnityCG.cginc"

		struct v2f{
			float4 pos:SV_POSITION;
			float3 wN:TEXCOORD0;    //世界坐标的法线
			//float3 litDir:TEXCOORD1;
			float4 wP:TEXCOORD1;     //点在世界坐标的位置
		};
		float4 litP; //线光源的几何中心位置
		float4 litT;  //线光源的方向
		float lh;      //线光源的长度
		float li;  //线光源亮度
		v2f vert(appdata_base v)
		{
			v2f o;
			o.pos=UnityObjectToClipPos(v.vertex);
			o.wN=mul(unity_ObjectToWorld,float4(SCALED_NORMAL,0)).xyz;
			o.wP=mul(unity_ObjectToWorld,v.vertex);
			//float4 wP=mul(_Object2World,v.vertex);
			//o.litDir=litP.xyz-wP.xyz/wP.w;
			return o;
		}
		float4 frag(v2f i):COLOR
		{
			float3 litDir=litP.xyz-i.wP.xyz/i.wP.w;//点到线光源中心的矢量

			float3 litDir1=litP.xyz+litT.xyz*lh-i.wP.xyz/i.wP.w;//点到线光源一个端点的矢量
			float3 litDir2=litP.xyz-litT.xyz*lh-i.wP.xyz/i.wP.w;//点到线光源另一个端点的矢量
			float len1=length(litDir1);  //到一个端点的距离
			float len2=length(litDir2);  //到另一个端点的距离
			//假设点到线光源两端点的矢量分别是一个直角三角形的斜边和直角边
			float len=abs(len1*len1-len2*len2)-4*lh*lh;//(2*lw)*(2*lw)
			//
			float diff=0;
			float att=1;
			float3 dr=0;
			//如果len小于0,可以推知当前点位于线段内侧的哪个几何空间内
			if(len<0)//判断 是否处于 线段光源的 内侧
			{
				//下面计算垂线段 向量
				//计算当前点到其中一个端点的矢量和线光源方向之间夹角的余弦
				float dt=abs(dot(normalize(litDir1),litT.xyz));
				//使用这个余弦和这两个矢量计算到线光源的垂直矢量
				float3 horT=dt*length(litDir1)*litT.xyz;
				float3 Ldir=litDir1-horT;//垂直向量
				//这个垂直矢量将会被当做光源的方向
				dr=Ldir;
				diff=dot(normalize(i.wN),normalize(dr)); // diffuse version 1
				diff=(diff+0.7)/1.7;// diffuse version 2
				att=1/(1+length(dr)); //使用这个垂直距离实现光源和几何形体的衰减
				att=att*att;
			}
			else//不然点就处于 线段光源的 外侧
				//假设线光源是从中心向两端衰减的,因此取光源线段上最近的点
			{
				if(len1<len2)
					dr=litDir1;
				else
					dr=litDir2;

				//
				att=1/(1+length(dr));
				att=att*att;
				//diff=max(0,dot(normalize(i.wN),normalize(dr))); // diffuse version 1
				diff=dot(normalize(i.wN),normalize(dr));// diffuse version 2
				diff=(diff+0.7)/1.7;
				//diff=diff*abs(dot(litR.xyz,i.wN));
			}
			float c= li*diff*att;
			//
			return c;
		}
		ENDCG
		}//end pass
	}
}

在这个着色器计算中,首先根据三角形3条边的大小关系,快速判断出点处于线光源所分割出的哪一类空间中,然后根据两种不同的情况分别计算出有效的光照衰减,下图展示了这种光源的照明效果:

1.5线光源的辐射方向

在上面的情形中,假设线光源是向四周均匀辐射能量的,但是这里将会增加一个条件,即线光源辐射的能量是带有方向的。首先需要在脚本中设定这个辐射的方向,然后在着色器中计算照明时的方向,脚本如下:

public class LineLit_2 : MonoBehaviour {
    public Transform lit;
    public Material mat;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        mat.SetVector("litP", lit.position);

        mat.SetVector("litN", lit.forward);
       // mat.SetVector("litR", lit.right);
        mat.SetVector("litT", lit.up);
	}
}

 这个脚本只比上节脚本多了一行代码,即对光源辐射方向的设定,然后在着色器中计算这个方向,和上面的着色器相比,主要多出来下面的代码:

                dr=Ldir; //灯光方向
				float diffN=abs(dot(litN,normalize(dr))); //灯光方向和辐射方向的点积
				diff=dot(normalize(i.wN),normalize(dr)); // diffuse version 1
				diff=(diff+0.7)/1.7;// diffuse version 2
				diff=diff*diffN;

对线光源辐射度方向的的设置主要是通过灯光方向和辐射度方向的一个点积来实现的,下面是带辐射方向的线光源效果:

1.6线光源的衰减

我们还可以进一步计算基于线光源中心的衰减,着色器里主要改进是当点处于线光源内侧的几何空间内时,对基于线光源的中心所做的衰减,相关代码如下:

if(len<0)//判断 是否处于 线段光源的 内侧
			{
				//下面计算垂线段 向量
				float dt=abs(dot(normalize(litDir1),litT.xyz));
				float3 horT=dt*length(litDir1)*litT.xyz;//LitDir的投影
				float hdensity=1-abs(length(horT)/lh-1);//计算能量分布位置
				hdensity=smoothstep(0,1,hdensity);
				li=li*(1+hdensity);
				float3 Ldir=litDir1-horT;//垂直向量
				
				dr=Ldir;
				float diffN=abs(dot(litN,normalize(dr)));
				diff=dot(normalize(i.wN),normalize(dr)); // diffuse version 1
				diff=(diff+0.7)/1.7;// diffuse version 2
				diff=diff*diffN;

				att=1/(1+length(dr));
				att=att*att;
			}

线光源衰减效果图如下:

2018-06-20 15:56:00 weixin_34391445 阅读数 73
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

 

游戏场景中灯光照明的构成

现实生活中的光线是有反射、折射、衍射等特性的。对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向。

在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效果与现实生活区别很大。最早期的时候,人们利用各种方式来模拟真实光照的效果,比如手动在贴图上画上柔和阴影,或者用一盏微弱的面积光源去照明物体的暗部以模拟漫反射现象等等。

然后出现了所谓的高级渲染器,用计算机的计算来代替我们的手工劳动来进行这个“模拟”的工作。在漫长的发展过程中,出现过很多很多计算方案,总体上分为这样几类:

  1. 直接模拟光线从被光源发出到最终被物体完全吸收的正向过程,也就是常说的GI(Global Illumination);
  2. 不直接模拟光线,而是反向搜集物体表面特定点的受光照强度来模拟现实照明效果,也就是常说的FG(Final Gathering);
  3. 完全不考虑光线的行为,单纯基于“物体上与其他物体越接近的区域,受到反射光线的照明越弱”这一现象来模拟模拟现实照明(的一部分)效果,也就是常说的AO(Ambient Occlusion);
  4. 将场景光照结果完全烘焙到模型贴图上,从而完完全全的假冒现实光照效果,也就是我们所说的Lightmap。

不论是GI还是FG,计算量都是非常大的,一帧图片需要几十分钟甚至几十小时来渲染,所以很难被应用在游戏设计领域。

因此在游戏设计领域,光照贴图技术依然是目前的主流方式。

由于光照贴图需要事先烘焙(baking)出来,且仅支持静态物体(Static Object),而我们的游戏场景中几乎不可能全都是静态物体,所以通常游戏场景中的灯光照明是多种照明方式的混合作用。

  1. 对于静态物体来说,大多使用光照贴图来模拟间接光的照明效果,然后加上直接光源的动态照明效果;
  2. 对于运动物体来说,则仅用直接光源的动态照明效果,或者使用光照探针来模拟间接光的照明效果。

随着技术的发展以及计算机计算能力的提高,也许在未来,我们能够直接在游戏场景中进行动态的全局光照模拟也说不定呢。新版Unity3D中就已经出现了Realtime Global Illumination,虽然这个技术还处于雏形阶段,所需要的计算量依然庞大,但确实为我们展示了一个令人激动的前景。

当然,技术是技术,产品是产品。技术是为产品服务的,再先进的实时全局光照系统,对于像素风格的游戏场景的提升也是几近于0。

选择合适的技术来完善我们的产品和制作流程”,以及“根据现有技术来设计产品和制作流程”,说的其实是同一个意思。


1. 直接照明(Direct Lighting)

Unity3D中的直接照明主要来源于各种灯光物体,而灯光物体本质上是空物体加上灯光组件。直接照明可以产生阴影,但光线不会反射、也不会折射,但可以穿透半透明材质物体。

 
 

1.1 灯光类型(Lights)

Unity3D中默认可以创建这么几种灯光:聚光灯、点光源、平行光、面积光,另外还可以创建两种探针(Probe):反射探针(Reflection Probe)和光照探针组(Light Probe Group)。

 
Unity中可以创建的灯光类型物体
平行光

平行光通常用来做阳光,Unity3D新建场景后会默认在场景中放置一盏平行光。平行光不会衰减。

 
unity_lighting04.png
  • Type:灯光类型,所有类型的灯光都其实共用一个组件,本质上是一样的。
  • Color:灯光颜色
  • Mode:灯光照明模式,每种模式对应Lighting面板中一组设定
    • Realtime:对应Realtime Lighting
    • Mixed:对应Mixed Lighting
    • Baked:对应Lightmapping Setting

Realtime Lighting是新出现的一种烘焙光照技术,它并不像传统的烘焙技术一样直接烘焙间接光照颜色和亮度信息到光照贴图上,而是烘焙物体和物体之间的关系信息,比如A面对B面有漫反射效果,B面对C面有漫反射效果等等。这样一来,只要物体之间的关系不变(也就是所有的静态物体都不移动位置),就不需要重新烘焙,从而使得我们可以在场景中随意运用动态光源(dynamic lights)。而传统的Lightmapping光照贴图方式则不支持动态光源效果(改变光源不会改变场景光照)。Realtime Lighting比Lightmapping要更耗费系统资源,所以手游上就不要考虑了。

  • Intensity:灯光强度
  • Indirect Multiplier:在计算该灯光所产生的间接光照时的强度倍乘
  • Shadow Type:阴影贴图的类型
    • No Shadows:无阴影贴图
    • Hard Shadows:硬阴影贴图
    • Soft Shadows:光滑阴影边缘(也就是阴影模糊效果)
  • Baked Shadow Angle:烘焙阴影的角度
  • Realtime Shadows Strength:实时阴影强度
  • Resolution:阴影贴图分辨率
  • Bias:阴影偏移,通常适当增加这个值来修正一些阴影的artifact
  • Normal Bias:法线偏移,通常适当减少这个值来修正一些阴影的artifact(不同于Bias的使用场合)
  • Near Plane:阴影剪切平面,对于与摄影机距离小于这个距离的场景物体不产生阴影
  • Cookie:Cookie相当于在灯光上贴黑白图,用来模拟一些阴影效果,比如贴上网格图模拟窗户栅格效果
  • Cookie Size:调整Cookie贴图大小
  • Draw Halo:灯光是否显示辉光,不显示辉光的灯本身是看不见的
  • Flare:Flare可以使用一张黑白贴图来模拟灯光在镜头中的“星状辉光”效果
  • Render Mode:渲染模式
  • Culling Mask
点光源

点光源模拟一个小灯泡向四周发出光线的效果,点光源在其照亮范围内随距离增加而亮度衰减

 
unity_lighting01.png
  • Range:光线射出的范围,超出这个范围则不会照亮物体
聚光灯

聚光灯模拟一个点光源仅沿着一个圆锥体方向发出光线的效果,聚光灯在其照亮范围内随距离增加而亮度衰减

 
unity_lighting02.png
  • Spot Angle:灯光射出的张角范围
面积光

面积光模拟一个较大的发光表面对周围环境的照明效果,通常面积光的灯光亮度衰减很快,阴影非常柔和。

Unity3D的面积光仅在烘焙光照贴图时有效,并不像Maya的Area Lights一样能动态照亮场景。

 
unity_lighting03.png
  • Width:面积光宽度
  • Height:面积光的高度

总的来说,Unity3D中自带灯光比较简单,根据我们在Maya中使用灯光的经验,可以很快熟悉这些灯光类型的使用。

1.2 阴影类型(Shadow)

Unity3D的灯光可以设置不同的阴影类型,分别是:无阴影、硬阴影、软阴影。要注意的是,不论是硬阴影还是软阴影,本质上都是用阴影贴图模拟的阴影效果,而不是真实光照而自然形成的暗色区域。

 
unity_lighting05..png

灯光上阴影设置部分会随着Mode参数的不同而变化,Realtime Lighting Mode对应的选项很多,而Baked Mode仅对应Baked Shadow Angle一项。

无阴影

灯光不产生阴影,新建场景后默认生成的平行光就是无阴影的。

硬阴影

阴影边缘清晰

软阴影

阴影边缘柔和,有过渡效果

阴影质量设置

虽然我们在灯光的阴影设置中可以调节Resolution以提高阴影质量,但真正的阴影质量调节应该在Quality面板中来进行,灯光中的阴影Resolution参数默认设置是Use Quality Settings,就是从Quality面板的设定中来选择。

 
unity_lighting06.png

从菜单Edit > Project Settings > Quality打开Quality面板,这里可以针对不同质量等级设置不同的参数。

 
unity_quality02.png

我们现在先不在这里对Quality面板做全面介绍,仅介绍关于阴影的那一部分设置内容:

  • Shadows:在当前质量下是不渲染阴影,还是只渲染硬阴影,还是软硬阴影都渲染
  • Shadow Resolution:在当前质量下阴影贴图分辨率,这就对应了灯光面板中的Resolution参数。
  • Shadow Projection:阴影贴图的投影方式,Close Fit方式会优化近处的阴影质量,缺点是运动状态下可能会出现一些波动,Stable Fit方式不会有波动,但质量比较差

有的时候阴影贴图会出错,比如无缘无故多出一条亮缝之类,通常可以选择切换到Close Fit方式来解决,如果不想切换的Close Fit方式,可以适当降低灯光阴影参数中的Normal Bias参数,或者将对应场景物体设置成双面显示。

  • Shadow Near Plane Offset:很近处不渲染阴影
  • Shadow Cascades:阴影贴图叠加方式,可以是单层、2层或者4层
    • Cascade Splits:不同层所对应场景区域的比例分配划分
 
 

Shadow Cascades是一种阴影贴图算法,比如我们选择4层叠加,那么实际上会计算4次阴影贴图,每次对应距离摄影机一定距离范围以内的场景物体,而这个距离范围的划分就通过Cascade Splits中所显示的紫、绿、黄、红四种颜色区域所占比例来区分。紫色代表最近处的区域,而红色代表最远处的区域。紫色条越窄代表其对应的那一层阴影贴图所对应的场景区域越小,这样一来该区域的阴影贴图精度就很高了。

我们可以看到这里的Shadow Resolution就对应了灯光面板中的Resolution参数。

 
unity_lighting07.png

1.3 渲染路径(Rendering Path)

Unity3D提供两种渲染路径(Rendering Path),对于初学者来说,渲染路径这个概念不是很好理解,大家可以理解成是两种不同的渲染器,分别有利弊就好了。

1.3.2 Forward

在Forward渲染路径下,每个物体会被每个光源渲染成一个“通道”,因此物体受到越多灯光的影响,其渲染次数就会越多。

Forward渲染路径的优势在于,在灯光比较少的情况下,Forward方式的渲染速度会非常快,处理透明贴图也非常快,还可以使用诸如“多重取样抗锯齿(MSAA)”这样的硬件处理技术技术。

但Forward渲染路径的渲染速度会随着灯光的增多而迅速变慢,在一些有很多灯光照明的特定场景中(比如高科技室内环境)并不适合使用Forward渲染路径。

1.3.1 Deferred

使用Deffered渲染路径,渲染时间不会随着灯光的增多而提高,而是会随着受整体光照影响区域的扩大而提高(也就是说,场景中越多像素被照亮,渲染速度就越慢,但全屏被照亮的情况下,灯光设置复杂度不会进一步影响渲染速度了)。

Deffered渲染路径在整体上需要更多的计算量,对于一些移动设备,Deffered渲染路径还不能支持。

新版Unity3D的默认渲染路径是Deffered渲染,如果场景非常简单,或者希望使用MSAA,可以自行修改成Forward渲染路径。


2. 间接照明

间接照明有这么几种来源:

  1. 天光,也就是环境光(Ambient Light),特指来自于天空的漫反射。在Unity3D中可以继承“天空球”的颜色作用环境光颜色,也可以自行指定环境光颜色。
  2. 反射光,特指天空漫反射之外的所有环境漫反射。在Unity3D中主要通过光照贴图或灯光探针来模拟。
  3. 自发光物体。在Unity3D中自发光物体本身的亮度仅使用颜色来模拟,自发光物体对于环境的影响则通过光照贴图或灯光探针来模拟。

2.1 天空盒(Skybox)与环境光(Ambient)

Unity3D的天空盒类似于Maya中的天空球的概念,都是在场景外围生成一个封闭并正面向内的环境,用来模拟天空的颜色和照明效果。但Unity3D的天空盒采用的是Box形状的天空环境而非球形,用6张不同的贴图而非1张全景贴图来作为天空贴图。

我们可以将Maya中常用的全景HDR环境贴图转换为适用于Skybox的方形贴图,来创建我们自己的Skybox。这种转换可以在贴图设置中完成:

 
 

Default类型的贴图的Texture Shape2D改为Cube,然后修改Mapping6 Frames Layout (Cubic Environment),点击Apply就可以了。

Skybox的贴图都是高动态颜色深度的.exr图片格式(也就是俗称的HDR图片)。最好不要使用.jpg或者.png这种传统8位色深的图片来做Skybox,除非我们确认不需要对场景进行贴图烘焙(这样的话天空盒就只起到环境贴图的作用了)。

简单的场景(或者刻意追求一种纯粹的效果)可以不使用Skybox而使用纯色天空,甚至游戏不需要看到天空的,可以直接设置成None。

天空盒对于场景的照明影响主要来源于其对于环境光的影响。天空盒贴图所产生的环境光肯定比纯色环境光要更为丰富,也更为契合天空颜色一些。

环境光所需要的计算量很小,所以是很有效的照明手段,大家不要忽视了。

2.2 光照贴图(Lightmap)与烘焙(Baking)

简单来说,Lightmap就是用贴图来模拟全局照明的效果,但当今游戏引擎的Lightmap的功能却远远不是一张贴图那么简单。按照官方的说法,Lightmap中不仅可以包括物体表面的光照颜色信息(传统的Lightmap功能),还可以包括物体和物体之间的光线渗透关系信息(新版中的Realtime Lighting功能),也就是说,动态光源也可以对于烘焙了光照贴图的静态场景物体产生正确的光照。

光照贴图需要将所有参与的场景物体的UV重新排列组合成互不重叠且尽量少形变的方形结构,然后再把光照信息烘焙到一张或几张较大尺寸(最大到4K)的贴图中。这些烘焙好的贴图会被储存在场景文件所在目录下与场景文件同名的子目录中,所以烘焙光照贴图之前需要保存场景。

光照贴图烘焙参数设置
 
unity_lighting09.png

Environment:关于环境的参数设置

  • Skybox Material:设置天空盒材质
  • Sun Source:设置太阳,可以指定一个平行光作为太阳,然后该平行光的旋转角度会影响其亮度和颜色
  • Environment Lighting:关于环境光照的设置
  • Source:环境光照来源
    - Skybox:来源于天空盒
    - Gradient:来源于一个从地平线到穹顶的颜色渐变
    - Color:来源于单色
  • Intensity Multiplier:环境光照明强度强化
  • Ambient Mode:环境光照明模式
    - Baked:烘焙在光照贴图中
    - Realtime:实时
  • Environment Reflections:关于环境反射的设置
  • Source:环境反射来源
    - Skybox:来源于天空盒
    - Custom:来源于一个自定义的Cubemap(方盒贴图)
  • Resolution:环境反射贴图分辨率
  • Compression:是否压缩环境反射贴图
  • Intensity Multiplier:环境反射强度强化
  • Bounces:环境反射计算次数

Realtime Lighting:关于实时光照烘焙的设置

  • Realtime Global Illumination:是否进行实时光照烘焙

Mixed Lighting:关于混合光照烘焙的设置

  • Baked Global Illumination:是否进行混合光照烘焙
  • Lighting Mode:光照模式
    • Baked Indirect
    • Distance Shadowmask
    • Shadowmask
    • Subtractive

Lightmapping Settings:关于光照烘焙的通用设定

  • Lightmapper:选择光照烘焙器
    • Enlighten:这是常用的一种烘焙器
    • Progressive (Preview):这是新版的一种烘焙器,还处于预览状态,它会先烘焙摄影机可见区域,再烘焙其他区域,所以预览较快
  • Indirect Resolution:间接光照分辨率(每单位长度多少体素(texel)),数值越高,光照细节越高
  • Lightmap Resolution:光照贴图分辨率(每单位长度多少体素),通常设置为Indirect Resolution的10倍左右
  • Lightmap Padding:修正两个物体的Lightmap之间的距离,以避免颜色渗透
  • Lightmap Size:光照贴图大小(最大4096)
  • Compress Lightmaps:是否压缩光照贴图
  • Ambient Occlusion:是否烘焙环境光遮罩
  • Final Gather:是否对最后一次GI光线反射后的光照结果再进行一次FG计算,勾选上会有较好的质量表现,但烘焙时间会增加
  • Directional Mode
  • Indirect Intensity:间接光照的强度
  • Albedo Boost
  • Lightmap Parameters:设置详细的光照贴图参数(可以使用几个默认值,或者创建新设置,应该是给熟手用的吧)

Other Settings:其他设置

  • Fog:添加场景雾效
    • Color:雾效颜色
    • Mode:雾效衰减模式
    • Density:雾效密度

设置完成后别忘了点击Generate Lighting按钮烘焙光照贴图!

光照贴图的烘焙(baking)是很需要时间的,新版Unity3D提供了自动烘焙的功能:Auto Generate选项,可以让我们在调试场景的时候无需频繁手动点击Bake按钮,但自动烘焙的结果并不会被储存起来,所以最终发布前还是需要手动烘焙光照贴图的。

注意,从名字上,很容易将“自动烘焙”和“实时全局光照”这两个设置等同起来,这是非常大的误解。

定义光照贴图比例

既然所有的场景物体都被Pack成一个大的贴图,那么一个多边形面片上的光照信息精度就受限于这个多边形面片所对应的UV在贴图中所占据的面积大小了。出于场景优化考虑,我们当然希望将有限的光照贴图面积尽量多的分配给更需要的物体咯,所以Unity3D在Mesh Render组件中提供了修改物体所占光照贴图比例的参数:

 
unity_lighting10.png
  • Scale In Lightmap就是控制该物体的UV在Lightmap的重排中比例缩放的,数字越小占比越少。

怎么决定哪些物体的UV占比低哪些物体的UV占比高呢?通常远景物体占比比近景物体低,表面很平滑的物体占比比表面细节丰富的物体占比低,处于内部不太可见的模型占比通常要尽量低,地面或者地形这种很大面积的物体,占比中等就好了,否则就挤占了其他物体的灯光贴图细节了。

2.3 灯光探针(Light Probes)

光照烘焙对于动态物体(Dynamic Object),也就是没有被设置成Lightmap Static的物体来说都是不起作用的,如果希望动态物体也能被正确的照明,则需要创建Light Probe Group。

Light Probe可以被认为是在场景中的一个小“光源”,而多个Light Probe组成的网络,就是Light Probe Group。这些小光源通过烘焙得到场景中该点的亮度信息,然后整个网络用这个信息来照明动态物体。

同一时间内只会有最靠近动态物体的那些Probes会起作用,而且Light Probe离运动物体越近,其照明效果越强。我们可以根据场景光照环境特征来设置合适的Light Probe Group。

为场景添加Light Probe Group可以很好的将动态物体与静态场景融合,尤其是在光照环境复杂的室内场景中,尤其需要添加Light Probe Group。


3. 如何提高图像的渲染质量

Unity3D中图像质量是由很多因素共同决定的,而且默认的参数设置常常都不是最佳的。而我们在制作游戏的时候,需要在游戏运行效率和游戏画面质量上做出选择。

有些游戏(比如2D游戏)的游戏画面基本与渲染质量无关,这时候就可以关闭一些影响性能的功能或选项来提高运行效率。

但有些游戏(比如3D游戏,或者仿真应用如虚拟楼盘效果图之类)对于图像渲染质量有较高要求,我们也需要知道可以通过哪些手段来增强画面效果,同时明白这样做会牺牲多少运行性能。

设置质量等级(Quality Level)

Unity3D允许用户设置多个质量等级,并在各个等级中运用不同的质量参数,前面讲阴影的时候涉及过这方面的内容。

对于新手来说,常常会犯错的地方是明明设置好了高等级的图像质量,却在较低等级预览场景,或者明明需要输出成WebGL(默认使用中等质量等级),却不停地调整最高质量等级的参数。

选择渲染路径

简单来说,Deferred渲染路径的图像质量比较高,但Forward渲染路径在灯光不多的情况下速度比较快。

阴影质量

阴影出现Artifacts的时候请调整Bias参数和Normal Bias参数。

复杂场景的阴影质量需要手动调整Cascade Splits参数中多个层的占比,以保证近处阴影有足够的质量。

光照准确性

使用反射探针(Reflection Probe)

Unity3D中并没并真实的Raytrace反射,而是通过反射贴图来模拟所有的反射效果。

如果我们在场景中放置一个非常强反射的小球,我们就能看到这个小球上实际反射的是我们的Skybox,完全不会反射场景物体。这样一来不仅影响到场景中反光物体的反射正确性,同时也会严重影响整体场景的光照准确性。

我们可以为场景添加Reflection Probe来矫正不正确的反射贴图。

Reflection Probe可以看做是一个带有6个摄影机的点,它会渲染该点的6个方向(前后左右上下),将渲染结果拼成一个Cubemap,并应用给一个特定方框范围内的所有物体作为反射贴图。

对于比较复杂的环境,比如有多个区域的大房间,我们可以放置多个Reflection Probe并手动设置其影响范围。

 
unity_reflect_probe.png

Reflection Probe默认不会计算动态物体,仅计算烘焙物体,我们可以修改属性让其将动态物体也包括在内,同时还可以修改属性为Every Frame使其每帧更新以准确反射动态物体的运动过程,还可以增加Lighting Setting中的Reflection Bounces提高反射次数(这样就不会出现强反射物体在另一个反射物体中是黑色的情况了)。但要注意,这些修改都会占用更多的系统资源,尤其是每帧更新反射贴图这样的设置。


4. 如何提高烘焙效率

烘焙效率虽然不影响最终游戏的表现,但对我们制作过程有很大的影响。没人会希望每次修改了场景布局或者灯光布局之后都要花费几个小时甚至几十个小时的时间来烘焙光照贴图。

一个小技巧是不要将所有物体都设置成Lightmap Static参与光照贴图的烘焙。很多细碎的物体(比如地上的小碎石)并不需要很精确的间接光照效果,而且也可能根本没有足够的光照贴图精度来对应这些细碎物体,这时候用灯光探针可能比用光照贴图更有效率。

在Unite 2017关于灯光烘焙的专场演讲中,演讲者通过将细小物体设置为动态物体,并添加简单的Light Probe,让渲染时间从3.5分钟下降到20秒。

 
 
 
 


作者:shimmery
链接:https://www.jianshu.com/p/7594b044e6dc
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/wy87580575/p/9204238.html

2018-10-29 15:04:54 yuyingwin 阅读数 554
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

 最近看了很多群友的聊天,有不少人发了手头的作品,来征求建议,看到了一些共通的问题,因为我研究Unity的烘培也有一些年头了,所以决定针对Unity的场景烘培以及灯光的使用,写一个专题的文章来说明与探讨。

      首先声明一点,我这里不会去讨论Lighting面板里的参数,相对于传统的MAX烘培,Unity的烘培面板参数已经非常少了,而且这个面板影响的仅仅是你的光线够不够柔和,你的光影贴图尺寸是否合理。真正导致场景不好看的原因并不在这里。

      我们处理一个场景的流程,由建模开始,导入Unity,针对场景设计灯光,等待烘培,调整材质细节。
 

本帖隐藏的内容

      先说几个基础问题:

      ① 合理的设计,风格的统一,颜色的搭配,模型的尺寸比例,决定了你的场景是否有成为漂亮场景的潜质。做VR建筑可视化,归根结底,是把好的设计还原到虚拟空间中,如果设计没有美感,那么一切都是空谈。

      ② 不要盲目追求反射效果,反射只是一个锦上添花的东西,这是学习渲染的新手最常犯的错误,觉得场景中的各种反光效果是达成场景效果的精髓,恨不得整个房间都做成反射的材质。新手包括成手,永远要把模型质量和色彩搭配放到第一位,只有这些合格了,才可以去追求材质的真实反射效果,好的场景即便去掉反射也是好的场景,不行的场景一旦去掉反射就什么都不是了。

      ③ 增加场景的细节能极大提升场景质量,任何不容易注意的环节,斜放的椅子,翻开的书本,凌乱的衣物,都是场景的精华。

      再来对几个常见问题做解答:

      ① 为什么我的场景勾选了静态,但烘培不出任何光影?

      这种由建模及FBX设置的基础问题,是被提问次数最多的,如果遇到这种问题,请按照下面的步骤进行逐一排查:
      ■  模型必须有一通道UV?哪怕你只是一个单色的模型,也必须给一个UVW MAP命令;
      ■  模型是否有二通道UV?你可以选择在建模的时候分好二通道UV,也可以不分二通道UV,但要在导入Unity后,勾选FBX文件的Generate  Lightmap UVs,二者任选其一;
      ■  模型是否勾选了静态。

      ② 为什么我的房子漏光?

      ■  Lighting面板勾选Final Gather,以及增大其他烘培参数,可以解决非模型问题的漏光;
      ■  物理漏光:就是说房间没有外墙,只有内墙,阳光不被外墙遮挡,直接照进了房间里,这种的处理办法很简单,建一个外墙并按照下图的设置进行调整即可;

 

 

      ■  模型错误:有些朋友做模型不规范,只要可视范围内的模型看不见问题,就得过且过,这种模型造成的错误一旦出现,修改非常困难,请大家先看下面这张图:

      模型A与模型B,在地面建模时采用了两种方法,模型A采用了一体建模方法,而模型B采用了一个平面遮挡的方法,两种方法建出的模型,在场景漫游的时候,是看不到任何区别的,但是在烘培中,会有本质区别。如下图所示,模型A的阴影由墙壁产生,而模型B的阴影分为两部分,其一是由墙壁产生的室内阴影,其二是大于室内墙体部分的区域由直射光和环境光产生的光影(绿色部分)。

      在烘培中由于分辨率以及参数的种种原因,会导致绿色的区域蔓延进红色的区域,造成模型错误漏光。

 

      ■  二通道UV造成漏光:有些模型做的很规范,而且全部处于封闭的室内空间,依然有漏光现象。如果你的烘培参数足够,那么请检查模型的二通道UV,查看漏光部分是否存在UV重叠或UV块过于接近,当两个明暗差距较大的UV块距离很近的时候,颜色边缘会溢出,造成漏光的现象,如下图所示,这时调整二通道UV即可。


      然后说一说场景灯光的问题:


      ① 黑天白天分不清:
      看了很多朋友的作品截图,发现效果图的气息很重,当然我们很多同行都是由效果图行业转到VR这边,有些问题是难免的。
      效果图也有高低之分,即便你能分清效果图和照片,依然会承认很多效果图很接近照片质量。
      我们不讨论渲染手法和技术,仅对图片效果来说,先看一组一看就是效果图的效果图:

      很多初入渲染的朋友,还有一些急于提交项目的朋友,或着急看见效果的甲方,对画面的效果都有一个简单的要求,就是“亮”,为了达到这个目的,往往将房间内所有的灯全部点亮,并使用复杂的光域网达到眼花缭乱的光斑。

      再来看一组很接近照片的效果图:

      总结一下:

      ■  太阳光的强度远大于任何室内装修所用的人造光源,如果是一个阳光明媚的白天,室内的灯光要比夜间看起来弱许多;

      ■  图一窗外是晴朗的白天,而屋里却像夜间,大家可以在白天把自己房间的灯打开,观察是否能形成图中的光效;

      ■  图二画面中最明亮的部分是窗口和阳光洒进房间的光斑,接近真实空间的白天效果。

 

      同理,对于室外场景也是这样,晴朗的白天室外光线很刺眼,合理的调整光线强度,才能符合真实的环境效果,下图是群友的截图,我稍微PS了一下。

 

      ② 黑天室内不够亮

      与之前的问题正好相反,当天黑之后,房间内的人造光源亮度会被放大,看下面群友的截图,图A是原图,图B是我在PS里对亮度进行了调整。

      总结一下:

      ■  因为是PS调整,无法改变阳光角度,以常理论之,除非户型如此,不要把客厅窗户朝西,这样的户型不多;

      ■  以天空盒的颜色来看,阳光射入室内的角度会更大,甚至这个时候已经没有了直射的阳光;

      ■  整体亮度过暗,还是在房间内灯光全开的情况下,如果是真实房间,当天黑后,室内几乎是一片漆黑,这样的灯光亮度,合理的灯光布置应该是关闭两盏落地灯,吸顶灯,筒灯,只保留电视屏幕的光源和LED灯带(如果有);

      ■  夜间效果下,光源会显得更刺眼,而地面家具朝上的部分,要比其他部分更加明亮,如图B。

 

      ③ 如何平衡自然光与人造光(仅谈白天)

      ■  可以做阴天,可以拉上窗帘;

      ■  即便做了阴天拉上窗帘,室内最亮的地方依然是窗口及房间的窗口区域,为什么?因为阴天室外的亮度也强过室内,大家可以用自己的手机在房间内拍照对比在阴天室外拍照的清晰度;

      ■  人造光源的作用,仅做到告知此处有光即可,减弱对周围环境的影响。

 

      ④ 为什么要这么设置灯光:

      明确一点我们做的与效果图的区别,效果图做的是房间的图片,而我们做的是房间。

      如果你需要一张图片,那么无论在摄影还是渲染效果图上,都会对你拍摄的区域进行一些补光处理,但你真正要漫游贯穿整个房间的时候,自然的光线会让你有宾至如归的感觉,图片的目的是为了展示,而我们除了要展示之外,更要的是真实,要不为什么叫虚拟现实?

 

      如何达成一个真实的效果:

 

      真实的效果是由多种条件的共同作用下,达成的,我们使用引擎来制作场景,就是一个包含多种条件的集合。这个集合包含了规范且合理的三维模型,仿真的灯光,真实的贴图效果和合理的镜头特效。

 

      合理的三维模型在之前已讨论过,我们来说说其他几条。

 

      ① 仿真的灯光:

      我个人的经验来讲,室内的建筑可视化灯光原则是:能被自然光直接照到或间接照到的区域以自然光为主光源,人造光源为辅,不添加莫名其妙的灯光。

      ■  下图是我之前制作的一个小室内,主光源是窗口射入的太阳光,辅光源是橱柜下方的灯带和玄关穿衣镜处的灯带。

      ■  什么是莫名其妙的灯光,没有实体的灯,却产生了灯光。就好比你的房间没有开灯,却出现了光的亮斑,那一定是灵异事件。我们场景中的灯光往往不能达到真实空间的效果,参数不够会暗,参数过高又会使灯光附近的模型曝亮,所以在制作的时候,需要一定的补光,然而补光的光源需要做到间接照明的效果,如果产生了直接照明的光斑效果,对场景的影响往往很不好。

      ■  下图是我做的一个补光的效果,主光源是鞋柜顶部的隐藏灯带,但无法照明整个房间,所以在房间顶部补充了一个光源作为主光源的反射体。

 

      ② 真实的贴图效果:

      在平时的工作和聊天中,经常会被问到使用了什么shader,通常情况下,做展示,Unity5之后的默认标准材质球,就已满足了绝大多数的情况。

      你可以通过其他制作材质的软件或工具,按照unity标准材质球上给出的贴图种类制作即可,一般情况下,Albedo,Metallic,Normal,配合场景的实时灯光或反射球(Reflection Probe)就已经可以实现相对真实的效果,即使你不会Substance Painter,Substance Designer等软件来制作PBR贴图(我就不太会),仅仅使用Photoshop简单的处理一下,也会有质的变化。

 

      ③ 合理的镜头特效:

      和动画,效果图类似,我们的场景搭建及渲染工作完成后,同样需要进行后期特效的调整,这里给大家推荐了Unity的免费插件Post Processing。

      

      ■  这个插件包含了抗锯齿,反射,AO等等你需要的镜头效果;

      ■  没有哪个数值是完美的,符合你场景的风格才是最好的;

      ■  这个插件对场景的影响有多大,看下面这张对比图你就清楚了。

 

      关于场景烘培和灯光使用的基础,就讲到这里,对真实空间的观察以及制作场景时的思考远远大于烘培面板上的几个参数,烘培的参数,在Asset Store上下载几个好场景,人人都可以拥有,但为什么我们有一样的参数却做出不一样的效果?

 

      结论是,基础比什么都重要!

本文原来链接地址: http://www.bfwarch.com/forum.php?mod=viewthread&tid=370&extra=page%3D2

没有更多推荐了,返回首页