关于《Thinking in Unity3D》


笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙。不得不说,笔者最近几年的引擎研发工作中,早已习惯性的从Unity3D中寻找解决方案。

Unity3D虽比不上UE那么老练沉稳,气势磅礴。也比不上CE那样炫丽多姿,盛气凌人。但它的发展势如破竹,早已遍地生花!故而在此记录一些自己的心得体会,供大家参详交流。若有欠妥之处,还望各位及时指正。

Thinking in Unity3D由一系列文章组成,文章列表地址:http://www.cnblogs.com/geniusalex/p/5321545.html

什么是PBS


PBS(Physically Based Shading)在有一些地方也叫PBR(Physically Based Rendering),是一个基于物体表面材质属性的着色方法。与之前的Blinn-Phong等算法不同。PBS通过对物体表面的材质属性与周围光照信息来进行着色计算。PBS着色系统中,一个物体不仅受到光源的影响,还会受到周围环境的影响。 这会使得整个场景更加真实。

PBS有一个大前提,就是它能够满足光能传播过程中的能量守衡。能量守衡体现在三个方面。

1、一个对象反射出来的光照信息,不可能超过它接受到的信息。也就是说,全反射是一个物体的极限。

2、一个物体越光亮,那么它的颜色信息应该越少。(可以看出,refection 和 diffuse 应该是一个插值关系)

3、一个物体越平滑,那么它的高亮点会越小,越亮。

下图展示了以下事实

1、下图中所有的点,光照计算的方式一模一样

2、粗糙的表面,受到的光照影响后,亮的面积会多些。

3、越平滑的表面,高亮点越小,越亮。

4、点A的光照信息来自摄像机方向。

5、点B的光照信息主要来自天空的蓝色。

6、点C的光照信息主要来自地面。

PBS在Unity3D中的体现


在Unity3D 5.X中,默认的材质均被Standard Shader和Standard (Specular setup) Shader替代。 我们可以认为,Standard系列的Shader就是Unity3D中的PBS实现。下图便是使用Standard Shader渲染出来的场景效果。

若我们在Unity3D 5.x中新建一个空场景,你会发现有一个默认的天空盒。此时,我们再新建一个Sphere放在原点。 默认情况下,这个球的材质使用的就是Standard Shader.如下图所示,它受天空盒影响,上下呈现出不同的颜色。假如你更改天空盒的材质,那么这个球也会跟着变化。

Unity3D中PBS具体内容


PBS或者说PBR的原理只是一种指导思想,不同的引擎的实现还是有细微的区别。在此,我们先来看看Unity3D中,PBS的实现细节。请先看一张Standard Shader的材质参数图

左:Standard Shader     右:Standard(Specular steup)

第一眼看过去,熟悉PBR算法的朋友应该很容易看清楚Albedo、Specular、NormalMap、Occlusion、Emission等参数的意思。其余的就多半只能靠猜了。在此我们逐一说明每一个参数的含义。

1、Rendering Mode

Rendering Mode用于在非透明和多种透明效果之间切换。

Opaque:默认值,实体渲染。

Cutout:即Alpha test,通过贴图的Alpha值缕空模型表面。

Transparent:透明效果,如玻璃,半透明塑料等等。

Fade:在这个模式下,一个对象可以实现淡入淡出效果。

TransparentFade模式的区别

Transparent模式下,反射和高光叠加的颜色不会进行Alpha效果,也就是说,对于玻璃等效果,反射足够强的时候,只能隐约看到后面的内容,这也是符合能量守衡的,反射越多,吸收就越少。我们可以忽略细节,假设计算公式像这样:DiffuseColor * Alpha + RefColor * (1 - Alpha)。

Fade模式下则不会进行这样的运算,它会简单粗爆的进行Alpha计算。我们同样可以用伪代码表示:DiffuseColor * Alpha + RefColor * Alpha。

由此可以看出,Fade模式下,有较强反射的半透明物体,效果不会特别好,需要慎用。

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterRenderingMode.html

2、Albedo

Albedo与Diffuse的区别是,Albedo我们认为,它是一个只拥有颜色信息的“平面”贴图,即不带任何AO,SHADOW等光影信息。一个物体的Alpha信息,也是由这个提供。Albedo + Tint Color构成了物体的Base Color颜色值。

下图是常见的材质亮度表

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterAlbedoColor.html

3、Metallic & Specluar & Smoothness

前面提到Unity3D提供了Standard和Standard(Specular steup)两种着色方式。 无论是哪种着色方式,都是控制高光反射结果的。

Specular通过直接赋与颜色的方式来决定高光反射强度。而Metallic则通过一个0~1的值,来决定金属的反射强度。

不管是在metallic还是Specular模式下,一但使用了贴图来决定高光反射效果。引擎将会采用贴图中的值,设置的Metallic因子,或者Specular Color均会无效。在这种情况下,二者是等价的。但是,二者的效果是不一样的。根据实则结果,Metallic的反射比Specular要多一些。

Metallic为1的情况下,左:Smoothness=0.0、中:Smoothness=0.5、 Smoothness=1.0

常见物体的Specular+Smoothness一起变化时的情况表

常见物体的Metallic表

Smoothness则决定了一个物体的光滑呈度。 即使一个物体表面高光很强烈。若它是一个不光滑的物体,那么其反射会呈不规则的方向分布,会将光能分散到i同的地方。那么到达人眼中的反射光就会少。整体的反射效果就会变得很弱。

物体的由粗糙到光滑的光线反射情况

常见物体Smoothness表

注:当Metallic或者Specular被赋与贴图后。Smoothness值会失效。 转而采用Matallic或者Specular贴中的Alpha通道作为Smoothness值。

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html


4、Normal Map

Normal Map是Bump Mapping的一种特例化。 它主要是通过贴图为光照计算时提供更细节的法线信息。使物体低模物体表面具有高度的细节效果。如下图所示

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterNormalMap.html

5、Heightmap

Heightmap比NormalMap更上一层楼,NormalMap是通过赋与物体表面更多的法线信息,来造成光照上的细节增强。 Normal Map有一个缺点就是,当视线与表面平行时,就失去的法线效果。而Heightmap则直接对某些顶点进行位移。由此也可以看出来,Heightmap的效率开销会比Normalmap高,要更据情况选择使用。

高度图是一张灰度图,白色表示突出,黑色表示凹陷。如下图所示

更多细节请看官方文档:

下面的图展示了 左:普通效果   中:NormalMap效果 右:Heightmap效果

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterHeightMap.html

6、Occlusion Map

Occlusion Map用于决定一个模型各部位受到间隔光照的影响情况。 间隔光照一般来自于Ambient和环境反射。

Occlusion Map示例

左:无Occlusion Map  右:有Occlusion Map

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterOcclusionMap.html

7、Emission

Emission表示一个物体的自发光程度。默认是纯黑,如果为这个物体赋值了非黑色的材质。 那么这个物体即使在黑暗的场景下,也会有亮光。 我们可以简单的认为,计算公式像这样:FinalColor = Color + Emission

它一般用来做一些显示器等会进行自发光的物体材质,如下图所示。

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterEmission.html

8、Detail Mask & Secondary Maps

Secondary Maps用于在物体的表面增加细节。我们可以为一个物体再赋值一套Albedo和NormalMap. 经测试,第一套Albedo和第二套Albedo的叠加算法如下  AlbedoFinal = Albedo0.rgb  * Albedo1.a + Albedo0.rgb * Albedo1.rgb

Detail Mask则用于第一套贴图和第二套贴图的混合。具体公式如下。

Albedo0.rgb = Albedo0.rgb * (1 - DetailMask.a);

Albedo1.rgb = Albedo1.rgb * DetailMask.a;

AlbedoFinal = Albedo0.rgb  * Albedo1.a + Albedo0.rgb * Albedo1.rgb

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html

9、Fresnel

Fresnel即为菲涅尔效果。物体的表面与视线的夹角的不同,会导致眼睛看到的从物体反射出来的光线的反射量不同。

同一视角下,不同光滑程度的物体菲涅尔效果的差别

:目前的Standard Shader并没有直接为大家提供控制菲涅尔反射效果的因子。 而是通过Smoothness因子间接控制。

更多细节请看官方文档:http://docs.unity3d.com/Manual/StandardShaderFresnel.html

来去如风


Unity3D 5.x中对材质系统的改进,进一步促进了Unity3D画质效果的提升。 而基于PBS的着色系统,也让美术人员在实现某些高级效果的时候,不用纠结选用哪个材质更好了。

但是有以下几点需要注意。

1、虽然Standard提供的参数中,如果不进行设置,Unity3D会进行优化处理,避免额外开销。 但Standard Shader基于PBS的着色方式,在计算间接光照的时候有大量的开销。 并且像素着色器的复杂度,也远远高于传统的着色模式。因此,在手机上要慎用。 在PC上,游戏项目也需要进行一定的优化或者根据主次关系进行材质LOD。

2、Standard Shader仅提供了渲染层级的效果展示。 面对游戏中的若干需求,还是需要进行一些定制化。 这就要求我们需要将Builltin Shaders下载下来,在Standard Shader基础上进行修改。

3、对于手机项目,建议自已根据项目需求进行材质编写,去除不必要的间接光照计算。

整体参考文档地址:http://docs.unity3d.com/Manual/shader-StandardShader.html

Thinking in Unity3D:基于物理着色(PBS)的材质系统的更多相关文章

  1. Unity3d 基于物理渲染Physically-Based Rendering之最终篇

    前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-B ...

  2. unity3d 基于物理渲染的问题解决

    最近1个月做了unity 次世代开发的一些程序方面的支持工作,当然也是基于物理渲染相关的,主要还是skyshop marmoset的使用吧,他算是unity4.x版本 PBR的优秀方案之一了但在使用以 ...

  3. Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF

    在实时渲染中Physically-Based Rendering(PBR)中文为基于物理的渲染它能为渲染的物体带来更真实的效果,而且能量守恒 稍微解释一下字母的意思,为对后文的理解有帮助,从右到左L为 ...

  4. Unity3d 基于物理渲染Physically-Based Rendering之实现

    根据前文的例子http://blog.csdn.net/wolf96/article/details/44172243(不弄超链接了审核太慢)弄一下真正的基于物理的渲染逃了节课= =,弄了一下.公式和 ...

  5. 基于物理的渲染——间接光照

    在前面的文章中我们已经给出了基于物理的渲染方程: 并介绍了直接光照的实现.然而在自然界中,一个物体不会单独存在,光源会照射到其他的物体上,反射的光会有一部分反射到物体上.为了模拟这种环境光照的形式,我 ...

  6. PBR:基于物理的渲染(Physically Based Rendering)+理论相关

    一: 关于能量守恒 出射光线的能量永远不能超过入射光线的能量(发光面除外).如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降.如果不管反射轮廓的大小而让每个像素的镜 ...

  7. PBR(基于物理的渲染)学习笔记2

    相关资料 https://www.cnblogs.com/dojo-lzz/p/13237686.html 文档:PBR学习笔记.note 链接:http://note.youdao.com/note ...

  8. SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题

    SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题 基于物理块变化的复制,没有并行也是很快的. 逻辑复制的日志是按事务结束的时间排序的,而物理复制是与事务无关的, ...

  9. 基于物理渲染的渲染器Tiberius计划

    既然决定实现一个光栅化软件渲染器,我又萌生了一个念头:实现一个基于物理渲染的渲染器.

随机推荐

  1. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  2. Apache Ignite高性能分布式网格框架-初探

    Apache Ignite初步认识 今年4月开始倒腾openfire,过程中经历了许多,更学到了许多.特别是在集群方面有了很多的认识,真正开始认识到集群的概念及应用方法. 在openfire中使用的集 ...

  3. ABP文档 - Mvc 控制器

    文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...

  4. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  5. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  6. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  7. myrocks复制中断问题排查

    背景 mysql可以支持多种不同的存储引擎,innodb由于其高效的读写性能,并且支持事务特性,使得它成为mysql存储引擎的代名词,使用非常广泛.随着SSD逐渐普及,硬件存储成本越来越高,面向写优化 ...

  8. 0042 MySQL学习笔记-入门--01

    基本概念: 数据库DB(database): 数据的仓库,数据的集合,是数据的一种结构化的存储 数据库管理系统DBMS(database management system): 管理数据库的一套软件 ...

  9. Linux基础介绍【第五篇】

    linux权限位 Linux文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件属主权限.属组权限.其他用户权限. r:read可读权限,对应数字4: w:write可写权限,对应数字 ...

  10. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...