Thinking in Unity3D:基于物理着色(PBS)的材质系统

笔者在研究和使用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

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/p/5343449.html

时间: 2025-01-07 09:34:21

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

Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性

 Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性   出发点:Android系统本身是支持多种分辨率的,如图1所示,一般情况下要适配不同尺寸的设备只需要做两件事,1. 根据4种不同的屏幕尺寸提供4套UI布局(layout). 2. 根据4种不同屏幕像素密度(单位英寸的像素值)提供4套界面元素的图片. 图1 Android屏幕分类 而实际应用合并过程中存在的问题是:同一个应用对应的手机和平板界面设计是完全不一样的,如何根据屏幕的大小来决定提供哪一套界面是一件

物理渲染-基于物理的光照模型

文章所用图片来自相关领域文献,如有侵权请联系撤除, 转载本文请注明出处 1.关于光照模型 对于图形学领域和图形学开发来说,实时渲染的光照模型是一个最最基础的问题,简单的来讲,光照模型就是用来描述在真实环境下,物体表面一点在在光照下的反射颜色值.有许许多多的光照模型试图用数学的公式来模拟这个问题,当然这即是一个物理问题,也是一个数学问题.大学时最初接触计算机图形学时,对书本上关于光照模型的推到过程就极为不解,最近为了研究基于物理的光照模型看到一篇10年siggrgrah的course,(<Phys

求救 opengl 3.2 投影 投不出来 交互式图形学 基于opengl着色器的自顶向下方法 第六版

问题描述 看交互式图形学基于opengl着色器的自顶向下方法第六版运行后面的代码平行投影和透视投影投不出来完全复制附录代码也投不出来平行投影的顶点着色器代码为invec4vPosition;uniformmat4model_view;uniformmat4projection;voidmain(){gl_Position=projection*model_view*vPosition;} 去掉*model_view就可以投出平行投影加上去就什么都没有了是不是model_view矩阵出问题了完全用

Thinking in Unity3D:材质系统概览

笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎研发工作中,早已习惯性的从Unity3D中寻找解决方案. Unity3D虽比不上UE那么老练沉稳,气势磅礴.也比不上CE那样炫丽多姿,盛气凌人.但它的发展势如破竹,早已遍地生花!故而在此记录一些自己的心得体会,供大家参详交流.若有欠妥之处,还望各位及时指正.   Thinking in Unity3D由一系列文章组成,文章列表地址:http://www.cn

《嵌入式设备驱动开发精解》——1.2 基于ARM处理器的嵌入式Linux系统

1.2 基于ARM处理器的嵌入式Linux系统 嵌入式Linux应用开发完全手册 1.2.1 ARM处理器介绍 1.ARM的概念 嵌入式处理器种类繁多,有ARM.MIPS.PPC等多种架构.ARM处理器的文档丰富,各类嵌入式软件大多(往往首选)支持ARM处理器,使用ARM开发板来学习嵌入式开发是个好选择.基于不同架构CPU的开发是相通的,掌握ARM架构之后,在使用其他CPU时也会很快上手.当然,作为产品进行选材时,需要考虑的因素就非常多了,这不在本书的介绍范围之内. ARM(Advanced R

《嵌入式Linux应用开发完全手册》——1.2 基于ARM处理器的嵌入式Linux系统

1.2 基于ARM处理器的嵌入式Linux系统 1.2.1 ARM处理器介绍 1.ARM的概念 嵌入式处理器种类繁多,有ARM.MIPS.PPC等多种架构.ARM处理器的文档丰富,各类嵌入式软件大多(往往首选)支持ARM处理器,使用ARM开发板来学习嵌入式开发是个好选择.基于不同架构CPU的开发是相通的,掌握ARM架构之后,在使用其他CPU时也会很快上手.当然,作为产品进行选材时,需要考虑的因素就非常多了,这不在本书的介绍范围之内. ARM(Advanced RISC Machine),既可以认

惠普推基于Moonshot微服务器的融合系统

[天极网服务器频道4月16日消息]远程桌面交付一直是IT比较头痛的难题,在如今流行的云计算与大数据趋势下显得更加突出.近日,惠普联合AMD推出了基于惠普Moonshot ProLiant m700微服务器的融合系统HP ConvergedSystem 100. HP ProLiant m700微服务器采用AMD皓龙X2150加速处理器(APU)在一个4.3U的服务器机箱中,最高可配置180台服务器,每台服务器独有8GB http://www.aliyun.com/zixun/aggregatio

基于OpenFlow的虚拟机流量检测系统的设计与实现

基于OpenFlow的虚拟机流量检测系统的设计与实现 邵国林 陈兴蜀 尹学渊 张峰伟 云平台下的虚拟机在物理机内部交互流量,而不通过防火墙等安全组件.针对这类流量无法在网络边界被获取并检测的问题,分析了OpenFlow技术的原理,提出了一种基于OpenFlow技术将虚拟机流量重定向到入侵检测系统进行检测的方案.方案使用OpenFlow虚拟交换机和控制器替代传统交换机,然后基于OpenFlow技术控制流量转发过程,将其导向外部的安全组件进行处理,并构建了由虚拟交换机.控制单元.入侵检测和系统配置管

小鱼儿CTO赵兴国:基于阿里云的互联网+视频会议系统实践

2016云栖大会上海峰会于2016.1.20日在上海科技馆顺利举办.本文是根据小鱼儿科技联合创始人兼CTO赵兴国在2016云栖大会上海峰会<互联网+架构及实践专场>的演讲中分享内容整理而成.赵兴国以基于阿里云后台的视频会议系统为例,分享了互联网+的视频会议实践.   下面是演讲内容整理.   传统视频会议设备复杂,一般是四件套,会议系统必须外接电视.麦克风.摄像头,学习很复杂的摇控器,才能够开始使用.为保障视频会议效果,还需要搭建服务器.租专线,才能投入使用.并且每次开会都需要专业人员维护,比