Unity 5.x 读书笔记(一)

读Unity3D官方从入门到精通这本书,做的一点笔记,会加上查阅到的一些资料和个人的理解。


1. Sprite Editor 使用它可以提取复杂图片中的元素,分别建立Sprite精灵。

在图片Inspector模块中Texture Type中选择Sprite类型,Mode为Multiple,点击SpriteEditor。类似截图功能,用鼠标框选出要提取的图像元素,单击左上角Trim按钮,软件会自动对齐所选物体。(自己测试并没有成功,Bug?),选好要用的图像元素后点击Apply切割图片,查看原图片可发现展开后多出几个提取出来的Sprite。

点击图片,在Inspector面板中有一个Packing Tag,这个是与Sprite Packer打包工具对应的。打包工具会根据这个Tag标签,把具有同样标签的Sprite分类打包,制作图集,提高空间利用率


2. GI全局光照 Enlighten实时全局光照技术通过GI算法(这种算法基于光传输的物理特性的一种模拟 折射反射等)

方法:摄像机组件下RenderPath设置为延迟渲染,反射部分可以理解为类似于另一个光源,故采用延迟渲染,对应物体必须设置为Lightmap static。

测试:可以通过把环境光强度调低,光源方向光强度调高来验证效果。

效果可以参考Unity5.x 从入门到精通这本书上给的例子 376页,没有实现全局光照的场景里,阴影部分颜色单一无变化,而实现了GI的阴影部分会收到反射部分的影响,更真实。

如下是Unity2017.2.0f3版本中测试的例子,在Lighting面板中开启全局光照,摄像机勾选延迟渲染,物体Lightmap static勾选后全局光照的效果

Unity 5.x 读书笔记(一)

下图为Lighting面板中全局光照关闭的效果

Unity 5.x 读书笔记(一)

可以看到地面和物体分别接收光照后会继续反射光照,地面会带有物体的颜色,Cube也会变亮。

如下是讲着色模式调整为Indirect也就是非光源直接照射的光,在场景中也就是反射光的部分。

Unity 5.x 读书笔记(一)

3. 光照探针

上述是对静态物体(立方体)和静态场景(平面)做GI,当要对动态物体和静态场景做全局光照运算时,采用光照探针。光照探针记录全局光照在该点的光线信息,计算物体像素时会把最近的光照探针组成的四面体的光线加入计算。尽量把光照探针布置在光线变化敏感的地方,阴影等。

参考文章: Unity 5 中的全局光照技术详解  翻译文章:Unity 5 中的全局光照技术详解

4. 反射探针

在说明反射探针之前必须先了解立方体映射的原理,可以参考 [图形学] 纹理映射原理详解 的最后一部分,这里截取部分出来

--------------------------------------------------------------------------------------------------

立方体纹理映射

        另外一种映射物体纹理的方法是通过使用立方体纹理映射完成的。立方体纹理映射经常用于在模型表面近似环境光的反射。如下图,立方体纹理映射包含了六个二维成分,它们分别对应着立方体的六个面。s,t和p坐标表达了从立方体中心发出的指向样本像素的方向向量。

      Unity 5.x 读书笔记(一)

        样本对应哪一个面取决于绝对值最大的坐标的符号。另外两个坐标将除以最大的坐标值,然后利用下面这张表重新映射到[0,1]范围内,以产生2D纹理坐标(s',t')。这个坐标将用于对相应的立方体纹理映射面采样二维纹理映射,下图显示了立方体映射坐标和对应的六个面的朝向。

---------------------------------------------------------------------------------------------------

当我们计算某一点像素的入射光的反射分量的时候,我们只需要知道入射光线LightDir和法线分量Normal,这样就可以得到Reflect = -LightDir + 2 * dot(LightDir, Normal)* Normal。与这个公式类似,在Unity场景中,现在我们要知道该像素反应的是天空盒的哪一点,可以通过,摄像机与像素点的世界坐标相连,结合法线,用上述公式反推出一个向量,这个向量就是上图立方体映射中的向量,只要知道这个向量,就可以知道对应的是哪一张立方体贴图的哪一点。这就是天空盒的原理

在Unity中新建一个表面着色器并赋给一个球体,球体的镜面反射性和金属性调至最高,如下图所示,球会显示天空盒的映射。因为在Unity中表面着色器会反射天空盒,天空盒可以在Lighting-Environment-Skybox Material中设定。

Unity 5.x 读书笔记(一)

但是我们不仅仅需要它反射天空盒,当游戏中的场景特别复杂时,我们也希望它能反射其他物体,例如上图中,我们希望球体也能反射底下的平面。所以这就有了反射探针,反射探针的原理和天空盒的原理是一样的。当我们新建一组反射探针后,Unity对这些反射探针围起来的一个区域做一个自动计算,生成类似于天空盒的贴图,在这个反射探针内的物体就可以通过刚才所述的原理,对这个贴图进行采样,物体就能反射其他物体。如下图。左边是没有反射探针的,默认反射天空盒。右图加入反射探针后,反射天空盒和这个反射探针生成的贴图。

Unity 5.x 读书笔记(一)

参考文章: Unity 5 中的全局光照技术详解  翻译文章:Unity 5 中的全局光照技术详解

5. Baking Mode渲染模式

Realtime:光源不参与烘焙,只作用于实时光照。

Baked:表示光源只在烘焙时使用。

Mixed:光源在不同情况下做不同响应。在烘焙时,光源作用于所有参与烘焙的物体,勾选Lightmap static的物体。在实际游戏运行中,该光源则会作为实时光源作用于那些动态的或者没有参与过烘焙的物体非Lightmap static


6. Occlusion Culling(遮挡剔除)

遮挡剔除是指一个物体被其他物体遮挡住而相对当前摄像机为不可见时,可以不对其进行渲染。在Unity中并非自动进行。

步骤:

①选择Window-Occlusion Culling-Object-Occusion Areas-Create New Occlusion Areas新建一个遮挡剔除区域(一个长方体形状的区域)。

②调整这个区域,使它完全包含需要进行遮挡剔除的物体。

③选中所有需要进行遮挡剔除的物体,勾选Inspector-Static

④单击Bake按钮,对需要进行遮挡剔除的场景进行烘焙

⑤切换至Visualization面板查看即可

自己实践的过程中似乎出错了。以后再看看 待续。。。

tips:

采用在摄像机对象可以到的区域布置Occlusion Area的方式。

透明物体以及小物件不可能遮挡其他的物体,应标记为Occludees,这意味着这类物体能被其他物体遮挡,但不会遮挡其他物体。从而有助于减少计算量。其他物体一般情况下同时勾选Occluder static和Occludees static。