unity 3d l光照图和unity5 实时全局光照光只能2选1吗

君,已阅读到文档的结尾了呢~~
Unity3D光照贴图烘焙知识详解
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Unity3D光照贴图烘焙知识详解
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Unity的光照贴图为什么过亮呢?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:54,424贴子:
Unity的光照贴图为什么过亮呢?收藏
4.5之后的光照贴图总是过亮,不知道这是为什么呢?
乐变是卓盟科技的服务品牌,专注于为移动游戏和App提供升级,分包和加固的技术服务.乐变热更新可实现用户无感知的自动差分更新,已服务业内数千款产品,有效提升运营效率
你是不是忘把灯光删掉了
过量你可以将天光颜色和平行光颜色调暗
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 2645|回复: 2
【技术分享】详解Unity 5中的全局光照
本帖为抢楼帖,欢迎抢楼!&
16排名3昨日变化主题帖子积分
蛮牛币207616
在线时间1863 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 清风 于
18:22 编辑
  在图形仿真和光照特效方面做了重大改变。自从3.0版本开始,的光照效果一直局限于烘焙好的光照贴图。但后续的时间里,我们在全局光照领域有了很大的提升与改进,现在,是时候将其中部分美好的特性从Unity的沙盒中开放出来了。其中之一的新图形特性就是基于新的和极大改善的光照流程基础上的全局实时光照。这也是本文的重点。
  什么是全局光照?
  GI算法是基于光传输的物理特性的一种模拟。他是一种模拟光在3D场景中各表面之间的传输的有效方式,他会极大的改善你游戏的仿真度。不仅如此,他还可以传达一种意境,如果巧妙的使用,可以有效得改善你的游戏体验。GI算法不仅考虑光源的直射光,而且还考虑场景中其他材质表面的反射光。传统上,在游戏中,由于实时性的约束,间接光照的模拟因性能消耗过大而被弃置一旁。
  这些都是源于下面这个浅显的方程:
1.gif (7.16 KB, 下载次数: 0)
18:12 上传
  这个很简单。从某一观察点看到的光是从场景中物体表面点入射的光(Le)与从观察点上方的半球入射的光的叠加。Li描述的是从半球上某一角度w' 入射的光。反射项p描述的是光线如何反射到观察点,这项的取值依赖于入射角w‘和观察者的角度w。
  细心的读者可能已经发现L(x,w)在方程的两边,而且有一个还在在积分式中。如果不是这种情形,我们也许已经计算出全局光照的结果。由于物理规律是不太可能去修改的,研究协会提出了一套解决方案。
  其中最流行(最古老的)的是光线跟踪算法。这个算法从根本上改善了GI算法,在算法最困难的部分使用了一些比较耗时的技巧。光线跟踪在电影或者电视的CGI上使用了很多。尽管该领域涌现了大量的研究成果,但是一张图像的渲染还是要花费数秒的时间(哪怕使用非常先进的GPU)。
  光线跟踪通常使用的是屏幕空间,所以,一张图像每一帧都需要重新渲染。这意味着,他完全支持完全动态的场景:灯光、材料、几何形状自由变换的动画。这也是一个缺点,因为每当摄像机移动的时候,一张新的图片需要被渲染,而这张新图像的收敛融合需要花费数秒钟的时间。这也导致他无法适用于游戏场景。
  一张没有完全收敛融合的图像会有很多噪点,而且他是时间不相干的,所以,图像在完全收敛融合之前会有严重的闪烁。可以使用滤波来降低这种影响,但是不能彻底消除。下面是一些在不同收敛融合程度的图像。
2.gif (64.78 KB, 下载次数: 0)
18:12 上传
  最近,有了很多新的图像混合的算法,其中大部分都在GPU中运行,例如体椎追踪。这些算法中的大部分需要在具有一定内存大小的台式GPU上运行,他们只适合于高端PC系统。为了让全局光照在更多的平台(包括手机)下运行,这里做出了一些妥协。
  Enlighten介绍:
  Enlighten对于该提供了一套很好的解决方案。通过对问题的约束优化,他适用于各种尺度的终端机,从手机到街机,一直到高端的台式机。他已经被运用于Battlefield4,MoH Warfighter等AAA游戏。他是稳定可靠的。
  他的基本思路是如果一些可见光是预计算的(上面那个GL方程右侧的积分体),那么在移动端实现实时光照就是可行的。
  Enlighten允许的动态更改:
  环境光
  材质属性(漫反射率和表面自发光)
  GI仿真中的几何体部分必须被设置为静态的。但是动态的几何体可以使用GI根据静态几何体生成的光探针进行实时渲染。为了实现这个功能,Enlighten预计算GI实时仿真需要的数据。这个数据存储在一个实时模块中,该模块适用于大部分平台:SX, Windows, Linux, iOS, , PS Vita,PS3, PS4, Windows Phone, Xbox360 and XboxOne。WebGL目前正正在开发中,还不确定何时支持。
  Enlighten输出数据如下:
  实时光照
  实时光探针
  实时立体贴图
  Enlighten受限于GI对于漫反射传输的计算。漫反射是最重要的传输方式,因为他包含了全局光照的信息。由于漫反射是低频的,所以实时光照贴图可以是一张实时更新的低分辨率图像。另外通过增加动态更新的立方贴图来实现镜面/光滑面的反射。在Heckbert notation中,Enlighten使用了光线追踪子集L(D)*(S|G)?E。这意味着Enlighten包含了大部分的GI效果。而缺失的效果中最重要的是镜面反射(俗称散焦),你得用些技巧来达到该效果。
  下面是使用Enlighten,两种不同的光线设置渲染图像的例子。这些光线设置是完全动态的,而且之间的切换时瞬间的。
3.gif (86.52 KB, 下载次数: 9)
18:12 上传
  Viking Village – dawn
  接下来的这个镜头,使用了更加明亮的蓝色天空和更高更强烈的阳光:
4.gif (113.96 KB, 下载次数: 9)
18:12 上传
  Viking Village – sunny day
  下面这个镜头降低了阳光的强度,环境光为灰色且不饱和的。主要为环境光照:
5.gif (77.12 KB, 下载次数: 0)
18:12 上传
  Viking Village - overcast day
  最后是一张日落时分温暖静谧的画面:
6.gif (94.78 KB, 下载次数: 0)
18:12 上传
  Viking Village – sunset
  使用这种技术,可以赋予你游戏非常逼真的时间周期。
  Enlighten预计算
  场景中的大部分几何体都必须是静态的,实际上,这些大尺寸的几何体都会参与到GI的计算。在预计算阶段,Enlighten会自动将场景分解为数个子系统。去影响如何生成这些子系统是有可能的。这些系统被用于预计算大量的并行管道。管道之间是深相关的,并解决每一个系统的任务。这里有一个例子用于阐述Viking村落时如何被自动分解成多个子系统。
7.gif (63.44 KB, 下载次数: 6)
18:12 上传
  自动生成的Enlighten系统的编辑可视化
  在预计算完成后,系统之间的相互关系就确定了。这可用于在运行时部分减少对于静态几何体的限制。在运行时,在不同系统之间传输的间接光总量是可以控制的。这可以让你在系统切换之间实现淡入淡出,可以用于实现拆除或者打开们的效果。
  Enlighten运行时:
  Enlighten可以有效地运行于高端移动设备。他在一个线程中异步执行(或多个,如果平台允许)。移动平台中最突出的是直接光照或动态光照的阴影贴图需要在GPU中计算。所以,移动平台中只允许少量的动态光照。但是实时调整几何物体的自发光属性却是几乎无消耗的。Enlighten将自发光的物体作为可见物体计算。这意味着,自发光物体可以产生很好的阴影而不需要什么性能代价,即使在很低的分辨率配置下。
  得益于GPU对于直接光照和阴影投射的支持,Enlighten可以很好的实现动态光照,无论是在台式机系统还是街机,只要是能支持游戏的系统。
  这里是一个在ARM架构的平板上使用Enlighten的例子。
  关于烘焙:
  对于某些游戏来说选择烘焙可能更合适,所以将来也会很好的支持和发展烘焙流程。Unity5中光照的输入参数有:光源、自发光材质及环境光,你可以选择使用烘焙或者实时GI。选择烘焙的光照和Unity之前版本有同样的参数,它将被烘焙成光照贴图,而动态光照则由Enlighten运行库来处理。烘焙和实时GI可以无缝融合。
  Unity5中也有些新的烘焙特性。其中之一就是光照贴图被分散成组件形式。每个图集都包含5个光照贴图,它们分别是直接光照、间接光照、直接方向光、间接方向光和AO图(环境光吸收)。烘焙完成后,它们组合成光照贴图供游戏使用。在编辑器中可以指定这些图的融合参数。你可以调整这些选项来适配你最终的输出效果。例如,你可以很轻易的增加间接照明,这只需要在重新烘焙之前增加一个合成的工作,当然这个工作会花费你数秒钟的时间。
  光照流程
  Elighten不仅仅提供游戏中的实时GI。其中一个很重要的改进就是,Elighten为设计师们提供了全新的光照流程。当设计师们需要看到更高品质的细节的时候,它提供了更快的迭代模式。它使用迭代取代了完全重新的烘焙。不需要用户的干预,场景会被重新预计算与烘焙的效果替换,而这些预计算与烘焙都是在后台完成的。编辑器会自动检测场景的改动,并且执行所需的步骤来修复光照。大多数情况下,对光照的迭代几乎是瞬间完成的。
  什么类型的游戏需要用到Enlighten?
  之前提过,实时GI的局限性在于大规模的场景设定必须是预先确定的。是追求只适用于高端系统完全动态光照的解决方案,还是覆盖尽量多的场景并且可以在移动平台使用从而拥有更广阔的市场的解决方案,我们只能二选一。在5.0中我们选择了后者。下面是使用实时GI会存在一定困难的游戏类型列表:
  Q:可以实现开门效果吗?
  A:上文探讨过,场景会被自动划分为子系统,所以这取决于你的门,某些情况下是可以的。而另外一些就要借助脚本了。 (相关脚本会在5.x的版本中发布)
  Q:支持销毁吗?
  A:Enlighten支持场景中物体的动态透明。这意味着,游戏中要被销毁的物体需要首先被标注。当然这不是最理想的解决方案,他应该支持更多的功能。(该功能会在5.x中提供)
  Q:我可以通过流或者块加载关卡吗?
  A:当然,子系统可以通过流加载。你可以让你的场景块不包括子系统,然后手动或者通过脚本加载。(该特性会出现在5.0)
  Q:可以使用一些预先做好的模块来代码实现游戏场景吗?
  A:可以的,如果预先计算好模块所在位置的不同组合,你可以实现各模块之间的切换。这个就类似于你制作跑酷时的光照烘焙(无缝)。(这里所需要预计算的API会在5.x中提供)。
  Q:可以完全使用代码实现游戏世界吗,类似Minecraft?
  A:长话短说,不可以。然而,我们也在做很多项目,其中使用了ImaginationTechnologies中PowerVRRay Tracing然而来实现GI预览和混合。这可能是一个备选的方案用来解决由程序或者玩家创建场景的问题。PowerVR Ray Tracing技术支持全动态场景的GI。他不是全实时的,而且开始出现的数帧里可能会有噪点(因未融合收敛),但这是一个非常有前景的方向。在允许一定的延迟的情况下,它非常适用于用户自定义场景的光线渲染。(因项目还在研发阶段,暂时还没有案例)
  哪些是Free版,哪些是Pro版所拥有?
  这些特性在Free版和Pro版中的界限目前还不清晰,我们会在后续的博客中公布。
  5.0中有哪些?
  下面是5.0中的主要功能:
  游戏实时GI组件Enlighten
  迭代流程(服务于实时GI与烘焙)
  反射探针
  5.0后续:
  由于我们正对光照流程和生成做了很多的改动,其中一些因存在一些潜在bug可能会导致5.0的崩溃,后续我们会努力修复。下面这些是在5.x系列周期内会出现的特性:
  实时光照和烘焙光照的PowerVR追踪算法
  控制实时GI子系统间切换的API
  Enlighten实时立方贴图
  GI的实时透明支持
  预计算/烘焙的云/集群计算
开门; 光照插件;unity 5 如何让天空盒和室内光统一;unity 全局事件; 光照贴图;unity 投射帖图;英宝通 unity 5;unity3d5.0全局光照系统;vr支持的unity特效形式;unity 图像修复;unity5.x 3d 游戏开发技术详解与经典案例 光盘;u3d 5.0光照贴图会出错;详解unity 5 全局光照系统enlighten问题;u3d5.0场景烘培室内;最新 unity5 - 实时全局光照测试;unity3d全局照明;unity5 光照;unity 全局光;unity 5 全局光;unity加光照;unity 4个光照;unity5.2 场景烘焙;unity5.2多场景烘焙;unity5 场景烘焙;unity5不同场景烘焙;unity5.0 ;unity 多分辨率适配;unity5天空;unity5.0 天空;unity5.0天空 在哪;unity5.3 发布ao贴图unity ao贴图;unity5 全局光照;unity5.0全局光照;unity5灯光烘焙;unity5.0灯光烘焙;unity5.2灯光烘焙;unity5.0光照贴图;unity5材质贴;unity 5unity5.0unity 多摄像机叠加;unity5 烘焙参数;unity5.3 灯光效果;unity5配置;unity5.0 配置;unity5.3unity5.0灯光渲染;unity powervr ray tracing
本帖被以下淘专辑推荐:
& |主题: 220, 订阅: 9
& |主题: 7, 订阅: 0
每日推荐:
跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
5606/1000排名<font color="#FF昨日变化3主题帖子积分
熟悉之中, 积分 606, 距离下一级还需 394 积分
熟悉之中, 积分 606, 距离下一级还需 394 积分
在线时间97 小时
不错哦!不错哦!不错哦!
每日推荐:
9排名<font color="#FF昨日变化6主题帖子积分
蛮牛币2797
在线时间287 小时
一遇CE化成灰
每日推荐:
社区QQ达人
使用QQ帐号登录论坛的用户
连续签到30天
原创精华达人
原创精华帖子总数量 ≥ 100
突出贡献奖
宣传论坛,介绍更多的朋友加入≥50人
累积数量达到100000蛮牛币
游戏蛮牛QQ群会员
加入游戏蛮牛官方QQ群
在“新人报到 ”版块发过自己的照片
购买游戏蛮牛书籍
论坛发帖强人
主题帖子总数量 ≥ 500
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号unity3d(150)
本系列文章由&出品,转载请注明出处。&&
文章链接:
作者:毛星云(浅墨)&& &微博:
本文主要讲解了Unity中SurfaceShader的自定义光照模式的写法。
上篇文章中我们已经说到,表面着色器将分为两次讲解,上一篇文章中介绍了表面着色器的基本概念和一些写法,用内置的兰伯特光照模式来进行Surface Shader的书写,而本文将介绍Surface Shader&#43;自定义的光照模式的写法。
OK,言归正传,依然是先来看看本文配套的游戏场景截图。
运行游戏,音乐响起,金黄色的丰收之秋映入&#30524;帘:
参天大树:
小型村落:
OK,图先就上这么多。文章末尾有更多的运行截图,并提供了源工程的下载。可运行的exe下载在这里:
&好的,我们正式开始。
一、一些光照模型的概念讲解
我们知道,光照模型是真实感图形渲染的基础,从 1967 年 Wylie 等人第一次在显示物体的时候加进光照效果后,该领域迅速的发展。而这一节,我们主要看看最常见的漫反射、Lambert和镜面反射、Phong、Blinn-Phong这五种光照模型。
1.1&漫反射
环境光是对光照现像的最简单抽象,因而局限性很大。它仅能描述光线在空间中无方向并均匀散布时的状态。很多情况下,入射光是带有方向的,比如典型的阳光。
如果光照射到比较粗糙的物体表面,如粉笔,由于这些表面从各个方向等强度地反射光,因而从各个视角出发,物体表面呈现相同的亮度,所看到的物体表面某点的明暗程度不随观测者的位置变化的,这种等同地向各个方向散射的现象称为光的漫反射(diffuse reflection)。
简单光照模型模拟物体表面对光的反射作用。光源被假定为点光源,其几何形状为一个点,向周围所有方向上辐射等强度的光,在物体表面产生反射作用。
1.2&Lambert模型
漫反射光的强度近&#20284;地服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。
由此可以构造出Lambert漫反射模型:
Idiffuse =Id Kd cosθ
Idiffuse表示物体表面某点的漫反射光强
Id为点光源,Kd(0&Kd&1)表示物体表面该点对漫反射光的反射属性
θ是入射光线的方向与物体表面该点处法线N的夹角,或称为入射角(0≤θ≤90°)
入射角为零时,说明光线垂直于物体表面,漫反射光强最大;
90°时光线与物体表面平行,物体接收不到任何光线。
把环境光模型添加进来,最后,Lambert光照模型可写为:
I= IaKa &#43; Id Kdcosθ= IaKa &#43; Id Kd(L·N)
该模型包含环境光和漫反射光。
1.3&镜面反射
Lambert模型较好地表现了粗糙表面上的光照现象,如石灰粉刷的墙壁、纸张等
但在用于诸如金属材质制成的物体时,则会显得呆板,表现不出光泽,主要原因是该模型没有考虑这些表面的镜面反射效果。
如果光照射到相当光滑的表面,就产生镜面反射(specular reflection),镜面反射的特点是在光滑表面会产生一块称之为高光(high light)的特亮区域 。
镜面反射遵循光的反射定律:反射光与入射光位于表面法向两侧,对理想反射面(如镜面),入射角等于反射角,观察者只能在表面法向的反射方向一侧才能看到反射。
1.4&Phong光照模型&
Lambert模型能很好的表示粗糙表面的光照,但不能表现出镜面反射高光。1975年Phong Bui Tong发明的Phong模型,提出了计算镜面高光的经验模型,镜面反射光强与反射光线和视线的夹角a相关:
&Ispecular = Ks*Is*(cos a) n
&&& 其中Ks为物体表面的高光系数,Is为光强,a是反射光与视线的夹角,n为高光指数,n越大,则表面越光滑,反射光越集中,高光范围越小。如果V表示顶点到视点的单位向量,R表示反射光反向,则cos a可表示为V和R的点积。模型可表示为:
&Ispecular = Ks*Is*(V●R) n
&&& 反射光放向R可由入射光放向L(顶点指向光源)和物体法向量N求出。
&R = (2N●L)N – L
我们重新来看Phong光照的另一种表现形式:
Ispec = IsKscosns α(α∈(0,90?))&
Ks为物体表面某点的高亮光系数
ns为物体表面的镜面反射指数,反映了物体表面的光泽程度, ns越大,表示物体越接近于镜面。
只有视线与光源在物体表面的反射光线非常接近时才能看到镜面反射光,此时,镜面反射光将会在反射方向附近形成很亮的光斑,称为高光现象。ns越小,表示物体越粗糙;当ns为零时,镜面反射光便退化为与视点、光源均无关的环境光。&
另外,将镜面反射光与环境光、漫反射光叠加起来形成单一光源照射下更为真实的Phong光照模型:
I = Ia Ka&#43;IdKdcosθ&#43;IsKscosns α&
θ :入射角
α :视线与镜面反射方向的夹角
1.5&Blinn-Phong光照模型
&图形学界大牛Jim Blinn对Phong模型进行了改进,提出了Blinn-Phong模型。Blinn-Phong模型与Phong模型的区别是,把dot(V,R)换成了dot(N,H),其中H为半角向量,位于法线N和光线L的角平分线方向。Blinn-Phong模型可表示为:
&Ispecular = Ks*Is* pow(( dot(N,H), n )
其中H = (L &#43; V) / | L&#43;V |,计算H比计算反射向量R更快速。
Unity中,Phong实际上指的就是Blinn-Phong,两者指的同一种内置光照模型。
PS:光照模型部分的内容主要参考为:http://cg./
二、关于自定义光照模式(custom lighting model)
在编写表面着色器的时候,我们通常要描述一个表面的属性(反射率颜色,法线,…)、并通过光照模式来计算灯光的相互作用。
通过上篇文章的学习,我们已经知道,Unity中的内置的光照模式有两种, 分别是Lambert (漫反射光diffuse lighting) 和 Blinn-Phong (也就是镜面反射光(高光),specular lighting)模式。
然而,内置的光照模式自然有其局限性。想要自己做主的话,我们可以自定义光照模式。
也就是使用自定义光照模式( custom lighting model)。
其实说白了,光照模式(lighting model)无外乎是几个Cg/HLSL函数的组合。
内置的 Lambert 和 Blinn-Phong定义在 Lighting.cginc文件中。我们不妨先来人肉一下他们的实现源代码。
windows系统下位于:
…Unity\Editor\Data\CGIncludes\
Mac系统下位于:&
/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)
Unity内置的 Lambert 和 Blinn-Phong模型的Shader源代码在这里贴出来:
OK,下面让我们一起来看看光照模式应该怎样声明和定义。
三、光照模式的声明方式
在Unity Shaderlab和CG语言中,光照模式是一个以Lighting开头&#43;自定义文字组合在一起的函数。
即,函数名为:
Lighting&#43; [自定义部分]
比如,一个可行的函数名为:LightingQianMoLightingMode
我们可以在着色器文件(shader file)或导入文件(included files)中的任何一个地方声明此函数。一般情况下,此函数有五种原型可供选择,具体如下。
一般情况下,于以下五种函数原型中选一种,进行实现就行了。
【形式一】
half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);
此种形式的函数可以表示在正向渲染路径(forward rendering path)中的光照模式,且此函数不取决于视图方向(view direction)。例如:漫反射(diffuse)。
【形式二】
half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
此种形式的函数可以表示在正向渲染路径(forward rendering path)中使用的光照模式,且此函数包含了视图方向(view direction)。
【形式三】
half4 LightingName_PrePass (SurfaceOutput s, half4 light);&
此种形式的函数可以在延时光照路径(deferred lighting path)中使用的。
【形式四】
half4 LightingName_DirLightmap(SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);
这种形式也是不依赖于视图方向(view direction)的光照模式。例如:漫反射(diffuse)。
【形式五】
half4 LightingName_DirLightmap(SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal,out half3 specColor);
这是使用的依赖于视图方向(view direction)的光照模式(light model)。
比如,一个光照模式(lighting model)要么使用视图方向(view direction)要么不使用。同样的,如果光照模式(lightingmodel)在延时光照(deferred lighting)中不工作,只要不声明成 _PrePass(第三种形式),就是行的。
另外,对于形式四和形式五的选择,主要取决于我们的光照模式(light model)是否依赖视图方向(view direction)。需要注意的是,这两个函数将自动处理正向和延时光照路径(forwardand deferred lighting rendering paths)。
PS: Unity在移动平台中暂时不支持延迟光照渲染。
做个总结,在自定义自己的光照模型函数时,根据需要在五种函数原型中选择一种,且:
光照模式的函数名为:Lighting&#43; [自定义函数名]
pragma声明为: #pragmasurface surf& [自定义函数名]
然后就是需要,仿照着其他的光照模式来填充函数体了。
我们举个例子:
OK,光照模式的声明就是这样。光照模式的函数体是其最核心的部分,需要根据具体的光照模式数学公式进行书写,我们将在接下来的写Shader实战中进行学习。
PS:估计这节的概念有些难懂,大家肯定在第一时间不能完全理解,没事,让我们依旧在Shader实战中把状态找回来。
四、写Shader实战
上文已经提到过了,: Unity在移动平台中暂时不支持延迟光照(Deferred lighting)渲染。因为延时光照不能与一些自定义per-material 光照模式很好的共同运行,所以在下面的例子中我们只在着色器正向渲染(ForwardRendering)中进行实现。
0.内置的漫反射光照
首先,我们根据上一节所学,写一个依靠内置的兰伯特光照模式的漫反射光的Surface Shader:
实现效果:
1.简单的高光光照模型
下面是一个简单的高光光照模式(specular lighting model)Shader。实际上他就是Unity内置的Blinn-Phong光照模型,实际上做起来并不困难。这边我们将它单独拿出来实现一下:
实现效果:
2.自制简单的Lambert光照
对应于Unity内建的Lambert光照,我们可以自定义原理类&#20284;的光照模式,实现自己Lambert光照:
实现效果如下:
3.自定义的半Lambert光照
接下来,让我们自制一个半Lambert光照。
Lambert定律认为,在平面某点漫反射光的光强与该反射点的法向量和入射光角度的余弦&#20540;成正比(即我们之前使用dot函数得到的结果)。Half Lambert最初是由Valve(大V社)提出来的,用于提高物体在一些光线无法照射到的区域的亮度的。
简单说来,半Lambert光照提高了漫反射光照的亮度,使得漫反射光线可以看起来照射到一个物体的各个表面。
而半Lambert最初也是被用于《半条命2》的画面渲染,为了防止某个物体的背光面丢失形状并且显得太过平面化。这个技术是完全没有基于任何物理原理的,而仅仅是一种感性的视觉增强。
遮蔽的漫反射-漫反射光照的一种改进。照明&环绕(wraps around)&在物体的边缘。它对于假冒子表面(subsurface)散射效果(scattering effect)非常有用。
半Lambert光照Shader的代码如下:
实现效果如下:
4.自定义卡通渐变光照
下面,我们一起实现一个自定义卡通渐变光照,通过一个不同的渐变纹理(渐变纹理可由PS制作),实现各种不同的渐变效果。
自定义卡通渐变光照Shader代码如下:
我们取不同的渐变纹理,可得到不同的效果。以下是五种不同渐变纹理和对应的效果图。
5.自定义卡通渐变光照v2
让我们在上面这个Shader的基础上,加入更多可选的属性,成为一个功能完备的渐变光照Shader:
我们将此Shader编译后赋给材质,得到如下效果:
可供调节的属性非常多,稍微放几张效果图,剩下的大家可以下载工程源代码,或者拷贝Shader代码,自己回去调着玩吧~
布料细节纹理&#43;灰白渐变纹理&#43;红色边缘光:
布料细节纹理&#43;灰白渐变纹理&#43;浅绿色边缘光:
布料细节纹理&#43;灰白渐变纹理&#43;白色边缘光:
布料细节纹理&#43;灰白渐变纹理&#43;无边缘光(黑色):
五、场景搭建
以大师级美工&#39740;斧神工的场景作品为基础,浅墨调整了场景布局,加入了音乐,并加入了更多高级特效,于是便得到了如此这次比较唯美的静谧之秋场景。
运行游戏,树影摇曳,我们来到金黄色的丰收之秋。
最后,放一张本篇文章中实现的Shader全家福:
OK,美图就放这么多。游戏场景可运行的exe可以在文章开头中提供的链接下载。而以下是源工程的下载链接。
本篇文章的示例程序源工程请点击此处下载:
Unity Shader系列文章到目前已经更新了7篇,一共实现了38个详细注释、循序渐进、功能各异的Shader,对Unity中的固定功能Shader、Surface Shader都已经有了比较详细、系统的讲解和实现。而可编程Shader按学习计划来说是以后的计划,目前还是未涉及,有机会在以后的文章中一起和大家一起探讨。
而大家如果仔细参考和阅读这七篇文章,会发现Unity中Shader的书写其实是非常容易和有章可循的。这大概就是浅墨写这个系列文章的初衷吧。
天下没有不散的宴席。
浅墨接下来的一段时间有一些大的游戏项目要接触,所以,Unity Shader系列文章每周周一的固定更新只能改为不定期的更新了。以后浅墨有了空余时间,会继续写博文来与大家交流分享。
OK,于未来某天更新的下篇文章中,我们后会有期。:)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:174329次
积分:2335
积分:2335
排名:第11746名
转载:306篇
评论:33条
(2)(6)(2)(2)(10)(13)(1)(6)(2)(1)(1)(6)(14)(41)(5)(5)(2)(5)(6)(14)(9)(4)(9)(5)(13)(1)(7)(6)(16)(17)(47)(8)(6)(8)(15)(2)}

我要回帖

更多关于 unity实时光照 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信