zoukankan      html  css  js  c++  java
  • Thinking in Unity3D:基于物理着色(PBS)的材质系统

    Image(1)

    关于《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的光照信息主要来自地面。

    Image(9)

    PBS在Unity3D中的体现


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

    Image(10)

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

    Image(12)

    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颜色值。

    下图是常见的材质亮度表

    Image(15)

    更多细节请看官方文档: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一起变化时的情况表

     

    Image(20)常见物体的Metallic表

     

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

    Image(21)

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

     

    Image(22)

    常见物体Smoothness表

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

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


    4、Normal Map

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

    Image(23)

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

    5、Heightmap

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

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

    Image(24)

    更多细节请看官方文档:

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

    Image(25)

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

    6、Occlusion Map

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

    Image(26)

    Occlusion Map示例

     

    Image(27)

    左:无Occlusion Map  右:有Occlusion Map

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

    7、Emission

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

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

    Image(28)

    更多细节请看官方文档: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

    Image(29)

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

    9、Fresnel

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

    Image(30)

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

    :目前的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

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/qilinzi/p/5343449.html
Copyright © 2011-2022 走看看