[{"data":1,"prerenderedAt":391},["ShallowReactive",2],{"\u002F2018-01-01-note-lightmass-deep-dive":3},{"id":4,"title":5,"body":6,"date":367,"description":12,"extension":368,"meta":369,"navigation":372,"path":384,"seo":385,"stem":386,"tags":387,"__hash__":390},"blogs\u002F_legacy\u002F2018\u002F2018-01-01-note-lightmass-deep-dive.md","深入LightMass系列笔记",{"type":7,"value":8,"toc":340},"minimark",[9,13,24,27,30,33,38,41,46,51,54,61,65,68,73,76,84,87,91,94,99,102,106,109,114,117,120,126,129,134,138,141,144,147,150,155,159,162,165,169,172,175,178,182,185,188,191,194,199,202,207,210,213,216,220,223,228,231,235,238,241,246,250,253,258,262,265,270,273,278,281,286,289,292,295,300,303,306,325,328,331,334,337],[10,11,12],"p",{},"UE4使用Lightmass对光照进行预计算，以节省动态光照计算的成本。",[10,14,15,16,23],{},"本文是EpicJapan的LightMass Deep Dive系列的总结，与之前更新的文章有重叠的地方可能会略过，如有需要可以参看[",[17,18,22],"a",{"href":19,"rel":20},"https:\u002F\u002Fwww.slideshare.net\u002FEpicGamesJapan\u002Flightmass-lightmap-epic-games-japan",[21],"nofollow","原始的PPT","]。",[10,25,26],{},"内容本身的UE4版本为4.13，当前UE4版本4.18。",[10,28,29],{},"其实这个系列讲的内容并不多，只是使用了很多配图，让人能非常直观的对Light Mass的计算进行理解。",[10,31,32],{},"预计算光照主要的组成部分有3个：Light Map、Shadow Map和Precomputed Light Volume。",[34,35,37],"h2",{"id":36},"light-map","Light Map",[10,39,40],{},"光照贴图是静态光照最重要的部分，当前关卡生成的光照贴图可以在World Settings一栏里面看到。",[42,43,45],"h3",{"id":44},"pointspotdirectional-light","Point\u002FSpot\u002FDirectional Light",[47,48,50],"h4",{"id":49},"direct-light","Direct Light",[10,52,53],{},"直接从光源所在处打出射线进行计算，对于有光源半径的光而言会多做一些计算。",[10,55,56],{},[57,58],"img",{"alt":59,"src":60},"image","\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb.png",[47,62,64],{"id":63},"indiret-light","Indiret Light",[10,66,67],{},"间接光照的计算核心是光子映射算法，详细的实现分为以下步骤",[69,70,72],"h5",{"id":71},"photon-mapping","Photon Mapping",[10,74,75],{},"首先从光源向周围放射光子，对命中表面的光子进行记录，并按照一定的条件进行光子反射。",[10,77,78,81],{},[57,79],{"alt":59,"src":80},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-1.png",[57,82],{"alt":59,"src":83},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-2.png",[10,85,86],{},"这个反射过程会重复多次，最终形成在物体表面的很多光子数据。",[69,88,90],{"id":89},"final-gathering","Final Gathering",[10,92,93],{},"从纹素出发，沿着光子的反射路径回溯性的收集光照信息。",[10,95,96],{},[57,97],{"alt":59,"src":98},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-3.png",[10,100,101],{},"在收集过程中并不会从自己周围收集，因为这部分的光照已经在直接光照中计算过了。",[69,103,105],{"id":104},"irradiance-caching","Irradiance Caching",[10,107,108],{},"要对场景中所有的纹素进行收集的话，不仅花费时间，且由于反弹并不是均匀的所以会有很多噪点。",[10,110,111],{},[57,112],{"alt":59,"src":113},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-4.png",[10,115,116],{},"所以这个时候就需要将收集的光照缓存起来，然后以插值的方式来收集光照数据。",[10,118,119],{},"当然上面的只是大致过程，其中还有很多细节上的优化，例如：",[10,121,122],{},[123,124,125],"strong",{},"Adpative Samping",[10,127,128],{},"如果在收集时，光子路径的相邻点间隔较大的情况，会增加额外的射线进行光照数据收集。",[10,130,131],{},[57,132],{"alt":59,"src":133},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-5.png",[42,135,137],{"id":136},"sky-light","Sky Light",[10,139,140],{},"天空光照稍微有些不同，并不会进行Photon Mapping。",[47,142,50],{"id":143},"direct-light-1",[10,145,146],{},"在Final Gathering时直接将SkyLight当作二次反射的光源进行光照收集。",[10,148,149],{},"对于场景中窗口过小导致收集到的间接光照不足时，可以添加LightMass Portal以放出更多的收集射线。",[10,151,152],{},[57,153],{"alt":59,"src":154},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-6.png",[47,156,158],{"id":157},"indirect-light","Indirect Light",[10,160,161],{},"天空光的间接光照则是对光照进行一个更小规模的MiniFinalGather。",[10,163,164],{},"不过这个说法可能不适用于当前版本，因为从4.18开始，天空光也可以接收多次反弹的间接光照了。",[34,166,168],{"id":167},"shadow-map","Shadow Map",[10,170,171],{},"这个系列并没有介绍阴影贴图，Shadow Map并不是为Static Light准备的，而是为Stational Light准备的。",[10,173,174],{},"在进行光照计算时，每一个动态的物体，都会根据自己的bound box与stational light的朝向关系，将Shadow Map合成到光照运算结果中去。",[10,176,177],{},"因此，如果Stational Light影响的动态物体特别多的时候，其效率是非常低下的。有时候考虑直接换为Dynamic Light反而更好。",[34,179,181],{"id":180},"precomputed-light-volume","Precomputed Light Volume",[10,183,184],{},"这个主要是在场景中生成预计算的间接光照缓存点，这样动态的物体就可以从中取得数据并插值得到自己的间接光照。",[10,186,187],{},"插值的方式中，ILCQ Point是根据物体当前的位置进行的，所以如果物体有一定的大小且移动速度较慢的话，就容易产生可见的阴影跳变。相对的ILCQ Volume由于使用多个点进行插值处理，运算成本会变高，尤其是对于非常大的物体。",[42,189,190],{"id":190},"缓存数据",[10,192,193],{},"PLV的数据是具有方向性的球谐函数",[10,195,196],{},[57,197],{"alt":59,"src":198},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-7.png",[10,200,201],{},"在计算的时候分为上下两个半球进行计算",[10,203,204],{},[57,205],{"alt":59,"src":206},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-8.png",[10,208,209],{},"计算方法是，在进行光照预计算的时候，对指定的缓存点，将直接光照与Final Gathering的值缓存起来。",[42,211,212],{"id":212},"缓存点的生成",[10,214,215],{},"生成方式总共分为三种",[47,217,219],{"id":218},"surface-light-sample","Surface Light Sample",[10,221,222],{},"这个是最单纯的，从每个Mesh的表面沿着法线方向进行缓存点添加。",[10,224,225],{},[57,226],{"alt":59,"src":227},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-9.png",[10,229,230],{},"可以通过配置文件进行行为修改。",[47,232,234],{"id":233},"detail-volume-sample","Detail Volume Sample",[10,236,237],{},"在世界中拖放Lightmass Character Indirect Detail Volume生成的缓存点。",[10,239,240],{},"这个Volume拖放之后会在内部生成缓存点。",[10,242,243],{},[57,244],{"alt":59,"src":245},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-10.png",[47,247,249],{"id":248},"uniform-volume-sample","Uniform Volume Sample",[10,251,252],{},"Lightmass Importance Sample这个Volume是在场景内全局性的生成缓存点",[10,254,255],{},[57,256],{"alt":59,"src":257},"\u002Fwp-content\u002Fuploads\u002F2018\u002F01\u002Fimage_thumb-11.png",[34,259,261],{"id":260},"usage","Usage",[10,263,264],{},"演讲中介绍了不少静态光照的配置技巧，这里只列出之前没有列出过的。",[10,266,267],{},[123,268,269],{},"反光板",[10,271,272],{},"直接将聚光灯打到一块板子上，只让间接光照计算影响到静态光照计算。",[10,274,275],{},[123,276,277],{},"Compress Lightmaps",[10,279,280],{},"这个光照贴图的压缩是有损的，如果关掉的话效果会变好，但是贴图体积会放大4倍左右。",[10,282,283],{},[123,284,285],{},"Lightmap Resolution",[10,287,288],{},"光照贴图的分辨率在配置时要注意，比最小的纹素小的光照细节无法被捕捉。",[10,290,291],{},"Static Lighting Level Scale",[10,293,294],{},"这个配置会影响到整个LightMass的计算，同样的如果导致小于RecordRadius的光照细节无法被捕捉。",[10,296,297],{},[123,298,299],{},"Use Emissive For Static Lighting",[10,301,302],{},"这个的光照计算和天空光一样是不会进行Photon Mapping的。",[10,304,305],{},"以及最后给出的配置和性能影响",[307,308,309,313,316,319,322],"ul",{},[310,311,312],"li",{},"Static Lighting Level Scale = 1→ 0.1",[310,314,315],{},"Num Indirect Lighting Bounces 👨→20",[310,317,318],{},"Indirect Lighting Quality = 1→10",[310,320,321],{},"Indirect Lighting Smoothness=1.0→1.0",[310,323,324],{},"Lighting Quality = Production Build Time",[10,326,327],{},"光照计算时间15m57s →4h10m24s",[10,329,330],{},"不过这个的演讲者是做建筑展示的，所以对静态光照的要求比较高，并没有考虑到游戏运行的成本。",[34,332,333],{"id":333},"总结",[10,335,336],{},"了解了静态光照的计算方法之后，在对其进行调整，尤其是要修改config.ini的时候非常的有帮助。",[10,338,339],{},"至少比盲目的调节选项然后等待漫长的光照计算之后来观察结果要好很多。",{"title":341,"searchDepth":342,"depth":343,"links":344},"",2,3,[345,356,357,365,366],{"id":36,"depth":342,"text":37,"children":346},[347,352],{"id":44,"depth":343,"text":45,"children":348},[349,351],{"id":49,"depth":350,"text":50},4,{"id":63,"depth":350,"text":64},{"id":136,"depth":343,"text":137,"children":353},[354,355],{"id":143,"depth":350,"text":50},{"id":157,"depth":350,"text":158},{"id":167,"depth":342,"text":168},{"id":180,"depth":342,"text":181,"children":358},[359,360],{"id":190,"depth":343,"text":190},{"id":212,"depth":343,"text":212,"children":361},[362,363,364],{"id":218,"depth":350,"text":219},{"id":233,"depth":350,"text":234},{"id":248,"depth":350,"text":249},{"id":260,"depth":342,"text":261},{"id":333,"depth":342,"text":333},"2018-01-01","md",{"layout":370,"status":371,"published":372,"author":373,"author_login":375,"author_email":376,"wordpress_id":377,"wordpress_url":378,"date_gmt":379,"excerpt":380},"post","publish",true,{"display_name":374,"login":375,"email":376,"url":341},"风铃","flinkor","flinkor@foxmail.com",2239,"\u002F\u002F?p=2239","2018-01-01 15:59:33 +0000",{"type":7,"value":381},[382],[10,383,12],{},"\u002F2018-01-01-note-lightmass-deep-dive",{"title":5,"description":12},"_legacy\u002F2018\u002F2018-01-01-note-lightmass-deep-dive",[388,389],"UE4","Lighting","lNxcndA-W2UxZRHbVV_MbKunnp78cQrGi-WboMRX8J8",1788763179428]