Unity3d办公场景灯光布设与光影烘焙及后处理【2021】

Unity3d办公场景灯光布设与光影烘焙及后处理【2021】,第1张

先看看本案例的部分效果截图:

本文小姐姐以一个办公场地为例,和童鞋们再次讨论Unity3d室内场景的灯光布设、光影烘焙和后处理,希望对初学者有所帮助,本例的3dmax场景如下两图所示,其中第二张图为从后面观察的截图。这个场景的模型面数原本为90多万,面线纵横交错,彷如蜘蛛网,为了优化场景和方便图解,小姐姐用3dmax最优化低面数精简单面建模方法重构了这个场景,由下图左上角的统计信息可见,面数缩减到了21.5万。无论使用Unity3d,还是UE4,或者CE等其他引擎,3d模型都必须用尽可能少的面数来构建,否则后期的光影烘焙和实时运行会遇到灾难性的卡顿,这是小姐姐反复强调的话题了,相信一些童鞋已经感同身受,但是还有一些童鞋硬着头皮往前冲,继续沿用效果图和动画的建模方法构建场景,最后一定会因模型面数太高绊倒在光影烘焙和作品实时运行这个坎上。因此对于VR和游戏场景,模型师一定要采用最优化低面数精简的单面建模方法来构建,无论使用3dmax、maya、C4D、Blender、Sketchup、Modo,还是其他3D建模软件,都应力求降低模型面数。需要说明的是,若在阅读本文过程中有什么疑问,可V询(qtpl_wx)小姐姐,也可去淘小姐姐的Unity模型预处理布光烘焙后处理特效美工场景优化实战教程。

由上面两图可见,小姐姐重构的场景,拓扑布线简洁平整,看上去很舒服,而且编辑 *** 作流畅无卡顿。

1. 场景结构解析

为了便于童鞋们对本例后续的理解,小姐姐先对这个场景的构造作一详解。由上面两图可以看到,这个场景是一个办公场所,从下到上分别由-1层(地下室)、1层、2层三部分组成,为方便观察,小姐姐将这三层拉开如下图所示。有童鞋可能会认为这三层都无屋顶,其实不然,因为小姐姐是用单面建模构造的场景,这个场景主要表现室内,所以屋顶的正面朝下,从上面看到的是屋顶的背面,所以看上去似乎是镂空的,这是单面建模的特点,面的背面都是镂空的,而当我们从室内观察的时候,屋顶是可见的,如下面第二张图所示。

三层之间是通过楼梯间贯通的,如下图所示,为了让大家看清关系,小姐姐将楼梯间水平向外移动了,并且楼梯间有玻璃幕墙,用来采光。

这个场景乍一看很复杂,仔细的童鞋会发现1、2层大致是左右对称的,如下图所示,这样以来,对于1、2层,我们只需搞清下面第二张图红线部分即可。

下面我们就先来看二层右半部分,室内陈设如下两图所示,其中有沙发、茶几、装饰品、挂画、饮水机、资料柜、椅子、接待台、转角办公桌椅、集中办公桌椅、打印机、复印机、台式电脑、笔记本电脑、货架、饮水杯、台灯、洗脸盆、马桶、书柜、玻璃隔断等。

二层右半部分的功能分区如下图所示,楼梯间右半部分有接待区、大办公区、两个小办公区、会客室、走廊、卫生间等。

通过以上的图解,相信大家对二层右半部分的结构就搞清楚了,与此同时,整个二层结构(如下图所示)也就都明白了。

二层结构搞清楚之后,我们再来看一层(如下图所示),由下图可见,一层与二层相比只是家具布局不同,建筑结构完全相同。

接下来我们再看看-1层,如下图所示,这一层比较简单,一目了然,没有窗户,采光主要依赖于屋顶的格栅灯。

楼梯间与地下室、一层、二层的联结关系如下三图所示,从图中大家可以看到这三层的墙体都有踢脚线和阴角线。

通过以上的图解,大家应该对这个场景的结构有了详细的了解,同时大家也可以看到最优化低面数精简单面建模方法构造的场景边面简洁平整,编辑 *** 作清晰流畅,可大幅度降低模型面数的优势。

2. 模型阶段预处理

小姐姐在别的文章中反复强调,用于VR和游戏的模型,无论你是用3dmax、maya、C4D、Sketchup、Rhino、lightwave、softimage、

blender还是modo等其它软件建模,都必须采用最优化的低面数精简单面建模方法构造场景来大幅降低模型面数,以保证Unity3d中场景烘焙的速度和质量及最终作品的实时运行流畅,同时在模型构建完成后,还应针对模型、材质、贴图、灯光、视锥剔除、遮挡剔除、LOD、和碰撞物进行优化预处理,以免场景导入Unity3d后才发现需要返回建模软件进行前置处理而白白浪费时间。

VR和游戏开发是一项多人协同的作业,建模师虽然不参与美工和程序,但也必须了解这两个阶段对模型阶段要求,除了采用最优化的低面数精简单面建模方法构造场景外,建模师还应了解一些优化预处理的知识点,下面小姐姐对这方面的知识点作一详解。

⑴. 建模方法的优化

很多刚刚接触Unity3d的童鞋,一直沿用以前做效果图和动画的建模方法,也就是习惯用建模软件提供的标准几何体堆砌场景,或者用二维线拉伸、旋转、放样等构件场景物体,并不间断地使用一些布尔运算开洞,这样的建模方法构造的物体面数非常多,模型自交严重,很多面都是无用的,Unity3d甚至UE4、Cryegine、寒霜等所有引擎,都强烈建议使用最优化的低面数精简单面建模方法来构建场景,简单地说,就使用最少的面数来构建场景,因为模型面数是造成卡机的最大祸首,有的童鞋很偏执,就是不改陋习,非要用自己习惯的方法建模,那没问题,往前走几步,必然卡顿在超高的模型面数上。建模方法不同,构建的同一物体的面数千差万别,因为游戏和VR引擎的场景是实施运行的,不像效果图和动画一样,最终只渲染成静帧图片或图片序列,从建模开始,就不注意控制模型面数,会导致后续的很多处理很难推进。最优化低面数精简单面建模,就是用简单的poly,通过切分面线,然后推拉构造物体,有效避免了模型自交,还可大幅度降低模型面数,所以建议大家使用小姐姐推荐的方法来构建场景,上面大家看到的案例场景,就是小姐姐自己构建的,面线平整简洁,面数很低。

⑵. 模型拓扑布线优化预处理

在前面的图示中,大家一定看到如下图所示的物体,我们不妨将它单独移出来,一定有人会问,小姐姐为什么要这样建模呢?这就是所谓的拓扑布线问题,也就是物体上的边线布设问题。一般情况下,物体(poly)的布线应根据物体的造型、材质、贴图、形变以及拆分UV2的需要来布设,同时这些边线的布设决定着模型面数的多少,不合理的布线会使模型的面数急剧上升。

有了解单面建模的童鞋存在很多疑问,觉得单面建模就是尽可能减少模型面数,一些模型的某些面上明明不需要边线,却发现某些面反而布设了边线,这正是物体的布线要根据物体的造型、材质、贴图、形变以及拆分UV2的需要来布设的原因。下面我们先来说说根据物体造型需要的布线(也就是可编辑多边形的边面切分或分割),因为上图那个位置有个窗户,我们需要在那个位置开个窗洞,一般情况下,按照最优化低面数精简单面建模的方法,先构造一个和窗户墙等大的几何体(如下第一张图所示),然后将需要开洞的面的上下和左右边分别布两条线(也就是连接两条线或者分割两条线),形成如下第二张图所示的网格面。

接下来选择中心的面(如下第一张图红色部分所示)删除,形成下面第二张图所示的洞口,同理,在背面也开一个这样的洞口,然后将两个洞口的边缘线桥接,形成第三张图所示的窗户洞。

一些用过单面建模的童鞋认为这个窗洞就开好了,但是,小姐姐认为,这里还需要对布线作进一步优化。原因是上面的方法将窗户墙的前面分割成了8个面(如下图所示),不仅如此,背面也被分割成了8个面,同时,还给每条外边线各增加了两个节点,把每个外边线分割成了三段,导入Unity后,顶面会因前后面各增加的两个节点,自动连接节点生成如下第二张图的6个三角面,底面和两个侧面也会各生成6个三角面,这个窗户墙会变成64个面,unity3d的模型面是按三角面处理的,也就是3dmax中的四边面到了u3d中,会自动连接每个四边面的对角线转换成三角面的,上面的64个面,就是64个三角面,64个面是怎么来的呢,前后墙面各8个四边面,就是16,窗洞4个四边侧面,加起来就是20个四边面,自动转换成三角面就是40个,窗户墙顶面、底面、左右侧面各自会自动变成6个三角面,这样又有24个三角面,40个三角面+24三角面,总共64个三角面。

如果对布线进行一些优化,即将下图中2、3节点与节点1焊合(或叫合并),5、6节点与节点4焊合,7、8节点与节点6焊合,10、11节点与节点9焊合,形成如下第二张图所示的布线,窗户墙的前面就只被分割成了4个四边面,同时也不会分割相邻面的边,这样以来,整个窗户墙(前后各4个四边面,顶底和左右两侧4个四边面、窗户洞4个四边面)总共16个四边面,导入u3d自动转换成32个三角面,这与前面的布线方法相差一半,有的童鞋说,相差一半关系不大,1和2相差一半,没什么区别,大家可别忘了,一个场景50万面和100万面,200万面和400万面区别可就大了。

如果不优化拓扑布线,这样的物体被大量复制,模型面数会急剧成倍上升,小姐姐这个例子比较简单,如果造型复杂,不优化拓扑布线,可不就是2倍的关系了,这也就是这个场景中小姐姐使用这种布线的原因。

下面用图示比较一下同一个物体在3dmax中不同布线之后四边面和顶点区别以及导入Unity3d之后转换为三角面和顶点的情况,如下面两图所示。

从上面的图示可见,不同的拓扑布线,模型的面数和顶点数是不一样的,有童鞋会问,为什么要强调模型的顶点数呢?因为模型的面是由线构成的,线是由顶点构成的,与其说模型的面数太多造成的卡顿,不如说是由顶点太多造成的,有童鞋肯定不服,那我们就在自己熟悉的建模软件中通过修改段数构造一个上千万个面的茶壶,然后将所有面全部删除,只留下顶点,我们会发现,即使没有模型面,顶点太多一样很卡的,也就是说真正的卡机其实就是由顶点引起的,所以在建模的时候,既要控制面数,也要控制顶点数,小姐姐用斜向布线就是让多个三角面或四边面共享顶点,以控制顶点的数量,下图所示的物体,如果用实体建模,顶点和面数会过千,小姐姐只用了几十个面和顶点。

有的童鞋对小姐姐推荐的最优化低面数精简单面建模不以为然,也不服气,来,小姐姐给你一些图震撼一下,请看下面的图。(非常抱歉,由于这里的文章有字数限制,导致本文无法完整展现,因此您可去CSDN博客阅读小姐姐的完整同名文章)

SRP中实现MSAA很简单。我们先在 CustomRenderPipelienAsset 中添加对应的枚举,MSAA默认关闭:

在 CameraRenderer 中,我们和后处理效果一块使用即可。在 Setup 中,如果开启后处理模块,我们设置MSAA采样数,并将其应用到我们的渲染目标的声明,位于最后一个参数中:

默认采样数为1,如果设置了MSAA,那么使用对应的采样数。

关闭MSAA和4xMSAA:

目前的MSAA只处理了颜色缓冲,如果想应用于深度我们需要分开设置。

注意MSAA想得到较好的效果是比较耗能的,之后会尝试增加TAA之类的抗锯齿方法。

缩放渲染可用于调整渲染的分辨率。在 CustomRenderPipelienAsset 中添加相应的浮点变量:

在 CameraRenderer 中,我们添加一个布尔变量来确定是否使用缩放渲染:

Render 中确定是否使用缩放:

注意在编辑器窗口中我们就不使用缩放了,以免耗能,在 PrepareForSceneWindow 中将布尔值设为false:

如果设置缩放渲染的话,就使用缩放数值调整缓冲大小,否则使用原摄像机的视口大小即可:

在 Setup 中应用,调整渲染目标的缓冲大小:

在 Render 中,我们也将缓冲大小传入 postFXStack.Setup 中。对于发光效果,我们可以设置一个布尔值来控制是否引用缩放,在 PostFXSettings 中设置 BloomSettings 结构体:

DoBloom 中,根据是否忽略缩放来调整缓冲大小:

对应的地方应用即可。

对于后处理,我们额外添加一个缩放pass来进行渲染缩放:

一个很简单的复制pass。

在 DoColorGradingAndToneMapping 的最后,根据缓冲大小的设置决定使用不同的pass:

0.5和2:

在Unity开发者课程讲座“添加2D用户界面文本”中,我们的教练Ben Tristem向我们展示了如何给游戏用户界面添加文本,他也给我们展示了如何增加一个背景图像精灵。

我将在本文中提及增加文本元素和代码,而如何添加背景图像将在下一篇文章中阐述。

一、添加文本元素

1、我们先选择2D场景模式,你可以点击场景标签上方的2D/3D按钮,如果它显示3D点击它,那么它会切换到2D模式。

2、点击Unity顶外框的游戏对象菜单,在打开的选择菜单中选择UI,然后会跳出一个隐藏菜单,在这里点击文本。

这时候,你会注意到在你的Unity工作空间的左边的层次结构中有一个Canvas项,你还可以看到Canvas层次结构目录下的文本元素。一个事件系统也会被列出,在这个课程中你可以忽略它。

3、点击Unity右上角的图层菜单,全选,这样做突出用户界面,使其可见。

4、在层次结构中双击Canvas,向前滚动鼠标滚轮,知道Canvas充满屏幕。接着选择结构层次中的文本元素,选择左上角的翻译工具,然后点击选中的文本元素。最后,点击翻译工具的彩色箭头,并且拖住文本元素,直到它对其于Canvas的中上部。

5、相机背景颜色默认设置为蓝色,你可以按照下图的步骤来改变颜色。

6、点击文本元素。然后,点击屏幕左上方移动工具。之后缩放,以便您可以看到重新调整大小的手柄,就像蓝点一样。点击并且拖动蓝点来重新调整文本框的大小,因此它可以占据你三分之二的底部空间。

7、修改文本颜色,样式和大小,这可以在检查标签中的文本(脚本)选项中进行。我们将增大字体的大小并将字体改为白色,这样就更加醒目。

请看下面的细节截图,它想你展示了这些特征都在那里。在文本框中键入以下文字:,世界。在你更改了这些设置后,点击播放按钮,看看是否能清楚地看到文字。

二、给你的文本添加脚本

点击左侧层次标签里的文本元素,移动你的光标到屏幕右侧的检查标签,并滚动到屏幕底部。点击添加组件按钮,并选择新脚本,一个命名对话框会d出,你可以键入脚本名字。将它命名为文本控制器,点击下方的创建和添加按钮。

为了找到脚本,点击屏幕左下角的项目标签中的资产文件夹。接下来,脚本图标就会显示,并带有一个C。双击它在MonoDevelop中打开,这就是Unity的文本编辑器。

你会马上看到启动器脚本,如下图所示。我们将会改变那个脚本,使得文本元素被公开。这将会允许脚本影响文本元素。

1、增加此代码到行2:

using UnityEngine.UI;

这将导入面名。它带来用户界面信息,并且让Unity知道有一个用户界面来交互。

2、增加此代码到7:

Public Text text;

这个代码是一个变量,可以被下方列出的方法访问。

3、增加此代码到11:

Txet.text=”Hello world”

这条代码告诉Unity你想要文本元素在屏幕上显示什么。

如果你准确键入所有的代码,那么你就不会看到任何红色的文字,并且该脚本将与下面的图片中的脚本相同。请确保你使用Tab键来缩进而不是空格键。同时,确保每一行每一个缩进都是相同的。

4、点击检查标签里的文本控制器脚本选项中的文本元素并拖到文本框中,这将文本元素中的文本与MonoDevelop中的脚本联系起来,请参阅下图:

接下来的步骤将会破坏一个指导者的挑战,不要读下去,除非你确实想这么做。

现在,我们将为脚本添加键盘交互。我们将在更新功能下做这件事。

1)添加这条代码到行16:

if (Input.GetKeyDown(KeyCode.Space)) {

2)添加这条代码到行17:

text.text = Space key pressed

3)添加这条代码到行18:

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11870175.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存