zoukankan      html  css  js  c++  java
  • 简谈游戏场景灯光配置方案

    http://tieba.baidu.com/p/2690022869

    转眼从北京辞职回老家也一年多了,在游戏公司干了几年回来我们这样的小城镇还真不知道该做点什么,所以也一直没找工作,在家花了几个月时间研究了下Unity自己做了个小游戏,因为以前在公司是专为游戏场景制定和制作最后的照明方案的,现在和大家聊一下游戏的灯光配置方案吧,小的我才疏学浅有什么不对的地方还请各位大神轻拍砖,大家一起多多交流~~因为现在主要聊的是照明的一些思路和方案,所以不会有太多的技术性的东西,如果有需要,在之后的文章里我会写一些更多的技术贴!好了~磨磨唧唧半天还是进主题吧!




    众所周知光线可以控制人们的活动,影响人们的心情,也可以影响人们感知各种事物的方式,然而人类对光线是如此地习惯,所以并没有多少人能够真正静下来去思考它,事实上许多CG艺术家大部分时间是在工作室里的,他们看到自然界光线的机会也就相对较少了,可是如果想要出色的运用光线创作出丰富的作品,了解光线的自然特性是一个基本要素。对于光线的一些基本知识我在这里就不废话了,网上随便一搜有很多更专业的文章!
    在游戏里因为是游戏,所以一些照明往往比现实中的光线更夸张一些,但基本的特性是一样的,我们仅仅只是让游戏场景展现得更吸引人罢了!




    先说一下Unity自身的灯光吧,Unity有着不错的灯光系统和灯光类型(至于Unity的灯光怎么运用我在这里也不多说了,官方的帮助文档里写得很清楚,网上也有一些不错的文章),可以在制作游戏当中就实时的观察到各种效果,包括强度,颜色,阴影等都可以在制作过程中灵活的调整。当然这样实时的光照对于游戏来说实在是太奢侈了,特别是面对手机游戏的时候,所以我们往往选择的是配置好灯光然后烘焙灯光贴图,这样可以大大的节省游戏运行的计算量,通俗点说就是不会让游戏太卡!Unity自带的烘焙系统也很强大,专业版的Unity还可以运用GI,这样可以大大提高烘焙的效果,更神奇的是Unity还会自动帮你分好所有Mesh的第二套UV,并自动分配好各自的LightMap,还能直接烘焙出AO图,这样的功能真的可以说相当方便了!
    但我个人觉得这样烘焙灯光贴图虽然相当方便,但也有很大的弊端。第一,Unity毕竟只是游戏引擎,它再怎么强大,可灯光系统也不会有专门的三维制作软件强大,比如说Max或者maya都有独立的灯光类型和一些插件的灯光类型,灯光的可调性也比Unity多很多,更别说可以运用各种高级渲染引擎把光照发挥到极致了。第二,Unity自动烘焙的灯光贴图通常是引擎自动分配的,什么东西在哪一张贴图上很不好控制,而且烘焙贴图的数量貌似也不能控制,这样对后期修改来说是很致命的,往往是要重新烘焙一次比如说加了一个区域灯。如果想在PS里手动修改其中一张灯光贴图,比如一个阴影的硬边或者锯齿,那你要找到这个物体在哪一张灯光贴图里的位置那就和大海捞针没什么区别了!但如果你用Max或Maya来烘焙灯光贴图不仅可以用高级渲染引擎,而且可以很好的控制物体所在的灯光贴图和灯光贴图数量,点对点的修改也是很方便的。第三,Unity烘焙的灯光贴图往往是不好修改和合成的,而用Max或Maya烘焙的图就可以灵活的烘焙出Color层,Shadow层,AO层等等,这样后期用PS,Nuke,AE等这些神器来调色、调整对比度、调整明暗等等来最终的合成,那是相当方便与快捷的,而且效果会好很多倍!稍微懂点影视后期合成的同学一看就知道~呵呵!~
    所以呢我在制作灯光贴图的时候一般都是用Max或Maya来完成的,至于Unity的烘焙方法我记得看过官方的一遍文档写的已经很详细了,感兴趣的朋友可以自己去找一下,在Unity圣典里有中文版的(在此也对Unity盛典里的几位大神表示感谢!)。

    好了,现在来聊一下给一个游戏场景设定灯光的方法吧!当模型组和地编把一个完整的场景交到你手上的时候,一开始你往往是感觉到无从下手,就拿我的一点实践简单的说一下个人的经验吧!首先要做的就是检查模型,这一步很重要,它不仅影响到后期的渲染计算量,还直接给程序那边带来压力,模型最容易出的问题就是没合点,或者各种导模型之后有些模型会出现双面,甚至是多个面重叠在一起,这个问题模型组的兄弟在建模的时候很容易疏忽大意,灯光组的朋友就相对容易发现一些了~最简单的方法就是打上简单的key light,给个白的材质球,然后渲染模型的360度旋转的动画,如果有闪面的地方那一定是有面重合的地方。尽量避免大面积的面重叠,双面叠加在一起就更该杜绝了(除非有特殊要求需要看到背面,但也要留一定的距离,不能直接勾选材质球的2-Sided),因为当你用高级渲染器(比如 finalRender ,Vray , MentRay等等….)这些渲染器使用二次光线反弹时,有重叠的面会成倍的增加渲染时间,更致命的是烘焙的的灯光贴图会有明显的黑边!
    其次一个问题就是检查有没有模型是漂浮在空中的,这个问题地编组在大量布置场景的时候是会经常发生的问题,他们也很难发现这些小细节(特别是在加了一个月班的时候~嘿嘿~~),这个问题有了灯光也很好解决,只要打开阴影什么东西是漂浮的是很容易发现的!
    发现这些问题要及时和模型组和地遍组沟通,及时修复这些问题,因为他们修改可能只需要半天时间,而你辛辛苦苦配置好灯光,再开高配渲染可能需要一两天时间,然后再发现这些问题,你又得重复一次,这时间真耗不起!~

    在确定好模型方面没有问题了,就可以和艺术总监一起商量整个场景的风格、配色、光影……等等!然后快速的出几套简单的效果图Demo,一起来确定最后的方案。




    室外的大场景一般是由自然光线构成,自然光具有各种各样的类型,并且它们之间区别非常之大。虽说自然光的光源都是太阳,但在不同时间和不同的天气情况下阳光表现出许多不同的特性,或软或硬、或冷或暖,使这种单一的光源变化出许多的形态,还有晚上的月光,这时更多的还有些人工照明。当然在一些奇幻的场景里灯光的颜色就和正常情况下有一定的区别了,为突出场景的奇幻性灯光的色彩一般会提高一些饱和度,让每一个区域的色彩对比更明显一些。

    室内的场景,比如说宫殿、房屋内、山洞等,这些场景为了突出各自的特色更多的就是人工光照明了,这时一个灯光师的经验就很重要了,多看一些优秀的CG作品和观察现实当中夜晚灯光的一些细节会让你有更多的灵感!最好做到在没有打灯前你大脑里就已经有整个场景在丰富灯光下的景象,在布置灯光时也是从整体到细节,一步步到最终理想的画面。室内灯光一般比较多,建议同类灯光用关联复制这样修改起来是相当方便的!
    室内光线与室外光线有很多性质上的不同,最大的不同是室内光线总是伴随着光线强度与发散距离成反比的现象,简单说就是所有人造光线都会有光线强度逐渐减弱的现象。人类掌控之下的光源还有另一个特殊之处,那就是它们总是为了满足人们的某种目的和需要服务的,这也是一个游戏灯光师必须做到的,我们要为这个游戏场景打出漂亮而且还符合游戏故事背景的绚丽灯光,烘托出这个场景的特定氛围!
    在游戏里还有一种特殊的光照,那就是功能性光照,比如说一条路的指引、传送点的亮光或者一棵很奇异的树的自发光…等等。




    另外还有一种情况属于混合照明,自然光和人造光并存于环境中,黄昏和夜晚时尤为常见。它们常带来色彩和强度有意思的组合,特别是当自然光的蓝色和钨丝灯或火焰的橙色这一组互补色共同出现时效果更有趣,也是我个人比较热衷的配色方案!

    在对一个场景进行打灯光的同时,还有一个非常重要的元素——阴影!这是我们在最初的设计时就应该考虑进去的东西。通常有两种形式的阴影:轮廓阴影和投射阴影。轮廓阴影是物体表面上光源的光线无法到达的背阴处。而投射阴影即是我们一般理解的影子,它是当物体处于光源和某一表面之间时,在处于其后方表面上投下的阴影。阴影在整个场景中起到了很重要的作用,它能带来现实感,也能勾勒出物体的轮廓,还能塑造戏剧性和悬疑的效果。所以在为一个场景设计灯光方案的时候,阴影同样需要和灯光一样重要的元素考虑进去!

    还得补充一个特殊的东西,那就是环境光遮蔽,也就是AO层,也有的叫OCC层。在三维图像制作中,增添环境光遮蔽层是加强真实感的另一种方法。尽管下图中没有实际的照明,但由于应用了这项技术而具有了纵深感和真实性,这正说明了阴影对纵深感和形态的描绘力,在物体接近和相交的区域增添阴影的这种做法对任何画面都有效果。


    在散射光源下,环境光遮蔽是我们认知物体形状的唯一途径,随着物体与物体的接近,他们之间来自环境的散射光越来越少,相近的表面就形成了阴影。另外值得注意的是,环境光遭遇的阻碍越多,阴影的色调就越暗。

    一般情况下阴影的照明是由辅助光提供的,辅助光通常是一种次光源或反射光源。在绝大多数情况下,辅助光的光源是柔和的散射光源,比如墙面和地面的反光或天空光,也就是说即使在强烈的阳光下,物体的背阴面仍然是由辅助光照亮的。阴影呈黑色的情况极为罕见(至少是在地球上),它们总是带有一定的柔和光线与温暖色彩。




    这也是选择Max或Maya等三维软件来烘焙灯光贴图的主要原因。Unity自带的渲染引擎虽然方便快捷、操作简单,而且能自动生成AO图,但毕竟它不是专业的渲染引擎,所以在全局照明和二次光线反射上是远远不及专业的渲染引擎的!





    在使用Max或Maya进行渲染时,如果打开了二次反弹和GI,渲染引擎对光线进行追踪计算,它能产生最准确的照明结果,但需要花费较长的渲染时间。此时可以理解为渲染器把光能看做是一种辐射,根据物体表面颜色的不同,照射到该物体表面的光线要么被反射,要么被吸收。白色的物体会均等的反射所有波长的光波,而黑色物体则会把所有光波都吸收掉。当白色的光线照射到红色的物体表面时,蓝色和绿色的光波被吸收,而红色则被反射回来。所以,当白色的光线照射到红色的物体表面时,被反射的是红色光波,而这些光子在行进路线中碰到另一个物体表面时,便会将红色的光线照射到这个物体表面上。这种现象就是光的辐射,它的存在使邻近物体的颜色发生相互作用。这也是非常美妙的,它让整个场景看上去更加充满了真实感。如果这些细节都交给美工去做那是非常复杂与繁重的工作,而光线天生就是一个绘画家它把各种色彩表现得更加生动,也在细节上精益求精!这使得我们的美工同学省去了很多时间,美工只需要绘制一个模型的基本固有色和简单阴影,其他的都可以交给灯光组来优化它!
    Max在使用高级渲染引擎时,可以更好的控制光线对物体的影响,包括光线在反射时对物体颜色的相互作用、阴影的强度和颜色等等~这些都可以很容易的在渲染设置里调节!这样比在Unity里设置灯光就更加的灵活与方便!




    今晚就写到这,至于怎么在Max里设置灯光到最终烘焙灯光贴图,AO图等等,我会在之后的文章里详细介绍!还是那句话请各位大神轻拍砖,欢迎大家和我多交流共同学习!在这留个我的邮:wslxj928@163.com 希望大家多多交流!另外小的狗胆把我前段时间完全自己独立开发的一个手机小游戏发出来(http://www.appchina.com/soft_detail_1282204_0_10.html),因为是卡通风格所以上面所说的一些问题没有完全表现出来,但基本的光照理念也能从中看得到,如果方便也劳驾大家下载一个看看,完全是免费的,也不插播任何广告,仅仅只是大家一起学习之用!如果需要介绍游戏的制作过程,那我也会花点时间详细的写一份教程,但程序方面我也只是个菜鸟,勉强能用罢了!
    好了!祝大家晚安!~如有转载请大家注明出处,谢谢了~

  • 相关阅读:
    Python全栈day19(函数补充)
    Python全栈day18(三元运算,列表解析,生成器表达式)
    Python全栈day18(迭代器协议和for循环工作机制)
    KVM虚拟化
    Python使用函数实现把字符串转换成整数
    MySQL备份1356错误提示修复办法
    Python全栈day17(文件处理)
    CentOS添加PHP至环境变量
    CentOS7.2编译配置LNMP环境(MySQL5.7.20,PHP7.0.24)
    php查询mysql数据库 查询条件替中文字符串变量时无法查询
  • 原文地址:https://www.cnblogs.com/123ing/p/3986490.html
Copyright © 2011-2022 走看看