【如何用十块钱买房】Unity室内场景 + 光照练习 1

作者:在木
2017-07-11
11 11 4

引言

十块钱买房?在Unity里面搭个场景就好了呀。

也不知道是从什么时候起,圈内就流行一种说法,说Unity适合做手机游戏,Unreal适合做大作。多年从事Unity游(jiao)戏(ge)开(zuo)发(ye)的我,真想替Unity报个不平。以绝大多数游戏团队的努力程度,还没到要拼引擎的地步!!!对熟练的开发者来说,用Unity做次时代画面的游戏也不是什么难事。

所以今天就从最简单的室内场景入手,扒一扒Unity的渲染机制吧。

(Unity版本 5.6.1f1)

模型导入

模型来自于asset store上的一个资源,链接如下

Asset Store

当然,这种家具模型资源网上是出奇的多,免费资源很容易找到,这里就不详细介绍了。

这里需要说一下模型导入的选项。在Project窗口里面点选模型文件(*.obj,*.fbx),就会在Inspector里面出现如下信息:

1_compressed

Scale Factor 影响的是导入场景后物体的比例,比如原来一个物体Scale Factor是1,导入场景后Transform里的Scale是(1,1,1),要是这里调成10,导入场景的物体就会变大10倍,但是其scale的数值不变,仍为(1,1,1)。

File Scale 有时候会发现有些.fbx文件会莫名其妙的特别小,因为.fbx默认的scale为0.01,而.obj,.ma这种默认的是1。在前几个版本里面这个scale是改不了的,需要在Maya导出模型文件的时候注意一下设置。这个版本可以选择把File Scale去掉,算是给程序员一个贴心的设计吧。

Mesh Compression 是对存储数据的位数进行压缩,并不是网格简化。

Read/Write Enabled 关闭了以后就不能通过代码修改模型的节点位置信息了。Unity的Mesh.triangles之类的接口是会有可能会出现,在运行时把工程里的模型覆盖掉的情况的。这大概就是针对这点进行一个的保护措施。

BlendShape 可以用作简单的插值动画。建议程序员学一学,用来做一些随机性的简单动画(像场景中的花花草草这种)特别好用。

Generate Collider 用于Mesh Collider

Keep Quads 对于需要用到Dx11 Tessellation技术的一些模型可能需要勾选。下面有一个关于Tessellation技术的介绍:

DirectX 11 Tessellation

或者直接看看asset store里面的shader(免费)

Asset Store

感觉Bump Mapping和Smooth都是比较牛逼,可惜只有DirectX支持(Mac党233333)

Generate Lightmap UVs 很关键的一点,Generate Lightmap UVs一定要勾上(当然如果有美工姐姐给做好了的可以不勾)。只有这个选项勾上之后,烘焙的光才有作用。

嗯嗯,大概点了和没点的差别如下:

2_compressed

3_compressed

Normal 就是法线,法线的计算方法就是三个点确定一个面,一个面再取正向的法线。分享一篇说法线的文章

A better method to recalculate normals in Unity - The Scheming Developer

Tangent 这里涉及一个切线空间的概念,好像知乎上已经有大神对这个做了总结了,在这里放个链接:

为什么要有切线空间(Tangent Space),它的作用是什么?

Tangent 选项涉及到bump map相关的效果,下面两张图片上图是没有计算切线空间的,下图是有计算切线空间的,可以明显看到上图在边缘处光照强度以及纹理分布不合理。

4_compressed
5_compressed

摆放模型

按照个人喜好来布置房间里的家具,我做的如下:

6_compressed

导入材质

7_compressed

给模型贴上材质。这里需要对应的材质的贴图。比如沙发的材质是这样的:

8_compressed

Unity 的新版本更新了材质系统,算是跟目前主流的PBR(Physically Based Rendering,既物理渲染)渲染技术接轨了。因为如此,可以看到材质上出现了的Metallic和Smoothness这样的系数。
主流的PBR技术使用的一个很重要的物理学光照模型(数学模型)叫做BRDF,全名叫Bidirectional Reflective Distribution Funtion,正是应为这个函数的出现使得物理渲染有了重大的突破。

对于BRDF的公式有很多不同的版本,流传比较好的应该是这个版本:

图形学的基本概念就是,不考虑透明物体的情况下,对于屏幕中的每一个像素点,从屏幕发射一个射线到场景中,对于射到的第一个物体上的交点,进行一系列乱七八糟的数学计算,最后得到的颜色值显示在屏幕上。当屏幕上所有的像素点都计算完之后,自然就会得到一个关于该场景的渲染图。而上面这个公式就是这一系列乱七八糟的数学计算中的一个很重要的部分。

等式左边为光线强度,也可以粗略的等同为反射光的颜色。其中v为视角方向向量,l为光线方向向量,N为法线向量,h叫做中途向量,就是下面这个东西:

9_compressed

其中的函数:

F(v,h) :Fresnel equation 菲涅尔效应,不知道大家还记不记得这个出现在中学物理里面的名词。生活中的例子是从不同角度看水看到的图像是不同的,垂直着水面能看到水里的东西,而斜着看会看到更多的倒影。这个效应在不透明物体的表面也会存在,这一项就是来描述这个效应的。

G(l,v,h):Geometry function 反映了由于物体表面的凹凸不平导致的光线的损失。看下下面这图就明白了。

D(h):Normal distribution function 这就是讨论得比较多的高光函数了,这个函数决定了高光的分布,不同的高光系数大概就是产生这样的效果。

有这个公式计算出来的可以理解为是specularity,再和diffuse color相加即可得到物体在该像素点的成色。diffuse color 可以简单的理解成是物体的带明暗的固有色。当然,实际的渲染中还需要考虑环境对于物体的影响,这部分就不展开了。

(PBR部分的图片的出处均在以下两个网站)

Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

(这个文章用丰富的图片作为例子解释了最主流的BRDF的计算过程,文章的最后给了一个Albedo+Normal+Metallic+Roughness+AO的例子)

Jordan Stevens - Technical Artist

(给出BRDF模型的Unity shader实现,以及各种不同的核函数,读后感觉十分震撼)

这样一来,Shader里的Albedo,Normal,Metallic,SmoothnessOcclusion就不难理解了。

Height Map 作为辅助normal map 的更加高级的贴图,效果(右)是比normal 贴图(中) 好不少。

Emission 让物体发光。这里的发光是会记录到光照的渲染流程里的(foward rendering慎用)。当然,和Maya的发光不同,这里的发光是不会自带那种模糊特效的,想要做好看的霓虹效果还是老老实实的加bloom吧。

Secondary Map 会叠加在第一层的纹理上,一般是用来做细节的。看下图就懂了:

Render Queue 这个东西早应该放到这里了。渲染队列,简单来说,数字大的会盖住数字小的。注意检测深度的最大渲染队列数是2500。

嗯,由于没有美工妹子帮忙做Metallic 和 Smoothness贴图,所以材质部分就马马虎虎的过了吧。

==未完待续==

终于把场景搭好了,可是现在的场景还是别样的丑呢。之后还有光线烘焙和加特效的环节,希望大家继续关注哦。

近期点赞的会员

 分享这篇文章

在木 

一个要做 好游戏 的程序员或美工 

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. 何晓雨 2017-07-11

    好东西要顶一个!d=====( ̄▽ ̄*)b
    Unity只要把渲染写好了是可以媲美UE的,而它只不过是把这方面的工作(或者说自由度)大部分交给了开发者。
    那些认为Unity只能做手游的,大多只是看到了把次时代模型简单加入到UE就能得到的真实效果而已。

  2. slfzys 2017-07-11

    很详细的说明~赞~

  3. tanyyt 2017-07-11

  4. 浑身难受 2017-07-12

    “G(l,v,h):Geometry function 反映了由于物体表面的凹凸不平导致的光线的损失。看下下面这图就明白了。”

    没看见下面有图啊

您需要登录或者注册后才能发表评论

登录/注册