[{"data":1,"prerenderedAt":981},["ShallowReactive",2],{"page-unreal fest-1":3,"page-count-unreal fest":595},[4,643],{"id":5,"title":6,"body":7,"date":619,"description":13,"extension":620,"meta":621,"navigation":624,"path":636,"seo":637,"stem":638,"tags":639,"__hash__":642},"blogs\u002F_legacy\u002F2021\u002F2021-01-24-ue4-fest-npr-note.md","UE4-Fest-NPR笔记",{"type":8,"value":9,"toc":593},"minimark",[10,14,23,30,33,36,39,42,45,48,55,58,61,64,70,73,82,86,89,92,124,127,130,133,136,139,146,149,153,156,159,165,168,174,177,191,194,197,203,206,214,217,220,226,229,235,238,241,247,250,256,260,263,269,272,278,282,285,291,297,300,306,309,312,315,321,324,327,330,341,344,347,353,356,367,370,373,379,382,386,389,392,406,409,412,418,421,427,430,436,439,445,449,452,458,461,467,471,474,477,485,488,494,497,500,503,513,516,523,529,532,536,539,542,551,555,558,587,590],[11,12,13],"p",{},"UEFest2020上一篇关于NPR效果实现的演讲。",[11,15,16,17],{},"PPT在这里：",[18,19,20],"a",{"href":20,"rel":21},"https:\u002F\u002Fwww.slideshare.net\u002FEpicGamesJapan\u002Funreal-festext2020winter-npr",[22],"nofollow",[11,24,25,26],{},"后面发现的视频在这里：",[18,27,28],{"href":28,"rel":29},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=L1tC6wnub2k",[22],[11,31,32],{},"npr是个很宽泛的概念，这边主要是讲ToonShader。",[11,34,35],{},"演讲的内容基于U4.25.4。",[11,37,38],{},"这边由于没有一个明确的生产目标，所以更多的关注流程的实现。",[11,40,41],{},"由于原始的PPT有很多思考和选择过程的记录，在这里会稍微重新组织下内容。",[11,43,44],{},"笔记是基于PPT制作的，后面虽然找到Youtube的视频，不过没找到时间从头看一遍……所以可能有的地方和视频说的不一样~",[11,46,47],{},"完成之后的效果：",[11,49,50],{},[51,52],"img",{"alt":53,"src":54},"image-20210117215700253","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117215700253_thumb.png",[11,56,57],{},"角色名 :齋藤胡桃",[11,59,60],{},"原本是准备做来放到MarketPlace上去卖的，为了这次演示重新设计，全部重做了一下。",[11,62,63],{},"角色设计方案：",[11,65,66],{},[51,67],{"alt":68,"src":69},"image-20210117220008747","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117220008747_thumb.png",[11,71,72],{},"最初的目标：",[74,75,76,79],"blockquote",{},[11,77,78],{},"不是实现单纯的CellShader，而是希望将一些插画绘制的手法融合进来。",[11,80,81],{},"希望是能够在相对较暗的空间中也能够很好的渲染出结果来。",[83,84,85],"h2",{"id":85},"引擎改造",[11,87,88],{},"和Unity不同，要在UE4实现渲染的改造是需要修改引擎代码的。",[11,90,91],{},"网络上也能找到一些改造UE4的Shading Model的方法介绍。",[93,94,95,103,110,117],"ul",{},[96,97,98],"li",{},[18,99,102],{"href":100,"rel":101},"https:\u002F\u002Fqiita.com\u002Fdgtanaka\u002Fitems\u002F41f96ef2090820035609",[22],"UE4のShading Modelを拡張する",[96,104,105],{},[18,106,109],{"href":107,"rel":108},"https:\u002F\u002Fforums.unrealengine.com\u002Fcommunity\u002Fwork-in-progress\u002F41288-toon-shading-model",[22],"Toon shading model",[96,111,112],{},[18,113,116],{"href":114,"rel":115},"https:\u002F\u002Fforums.unrealengine.com\u002Fdevelopment-discussion\u002Frendering\u002F1537277-toon-shading-models-stylized-rendering-experiments",[22],"Toon Shading Models, Stylized Rendering Experiments",[96,118,119],{},[18,120,123],{"href":121,"rel":122},"https:\u002F\u002Fforums.unrealengine.com\u002Fdevelopment-discussion\u002Frendering\u002F1704696-wip-anime-toon-stylized-shading-model",[22],"[WIP] Anime\u002FToon Stylized Shading Model",[11,125,126],{},"改造引擎主要的问题是实现方式很难和别人共享，改造后的版本只能内部使用。",[11,128,129],{},"重新编译C++和Shader的成本也很高，最大的麻烦是，引擎升级。",[11,131,132],{},"所以演讲中使用的制作流程没有对引擎进行改造。",[83,134,135],{"id":135},"基于向量",[11,137,138],{},"基于向量计算，使用蓝图和材质节点来达到目标。",[11,140,141,142],{},"参考的文章是这篇：",[18,143,144],{"href":144,"rel":145},"https:\u002F\u002Funrealengine.hatenablog.com\u002Fentry\u002F2019\u002F12\u002F01\u002F000735",[22],[11,147,148],{},"使用向量的内积来在材质节点中获取更多的信息。",[150,151,152],"h3",{"id":152},"光照向量",[11,154,155],{},"由于材质中的Light Vector只能在前向渲染中使用，所以在蓝图中写入到Material Parameter Collection中。",[11,157,158],{},"之后便可以使用法线与光照向量相乘来达到模拟计算光照的效果",[11,160,161],{},[51,162],{"alt":163,"src":164},"image-20210118232253776","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210118232253776_thumb.png",[11,166,167],{},"前面的内积结果会在模型上生成灰阶的渲染值，使用这个值作为下一步的Mask的基础。上图比较简单，当前的渲染结果是这样的：",[11,169,170],{},[51,171],{"alt":172,"src":173},"image-20210118233129915","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210118233129915_thumb.png",[11,175,176],{},"为了模仿通常ToonShader的效果，基于上面的内积的结果，总共计算了四个层的内容：",[93,178,179,182,185,188],{},[96,180,181],{},"Shadow: 模拟阴影计算，连接到SubSurface",[96,183,184],{},"HightLight: 模拟高光，连接到Emmisive",[96,186,187],{},"RimLight: 连接到Emmisive",[96,189,190],{},"Patten: 连接到SubSurface",[11,192,193],{},"上面三种都是比较常见的效果，所谓的Patten，其实是模仿有的漫画里的那种网点图的感觉",[11,195,196],{},"对于用于计算基础的内积结果，根据贴图会采用不同的插值方式。",[11,198,199],{},[51,200],{"alt":201,"src":202},"image-20210119230758187_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230758187_thumb.png",[11,204,205],{},"同时会按照需求使用一些其他的向量节点：CameraVector、ReflectionVector。",[11,207,208,209,213],{},"贴图提供的信息并不一定会按照0",[210,211,212],"del",{},"1来插值，有的会设定为1.0是必然使用，而0","0.5才会插值，总之这个可以按照需求来进行灵活的控制，毕竟贴图是自己制作的。",[150,215,216],{"id":216},"阴影",[11,218,219],{},"用于模仿阴影计算：",[11,221,222],{},[51,223],{"alt":224,"src":225},"image-20210119230028530_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230028530_thumb.png",[11,227,228],{},"效果是这样的：",[11,230,231],{},[51,232],{"alt":233,"src":234},"image-20210119230049261_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230049261_thumb.png",[150,236,237],{"id":237},"高光",[11,239,240],{},"用于高光模拟计算，由于是连接到Emmisive，所以可以受到Bloom的影响。",[11,242,243],{},[51,244],{"alt":245,"src":246},"image-20210119230329943_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230329943_thumb.png",[11,248,249],{},"最终结果是这样的：",[11,251,252],{},[51,253],{"alt":254,"src":255},"image-20210119230350972_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230350972_thumb.png",[150,257,259],{"id":258},"rimlight","RimLight",[11,261,262],{},"就是边缘高光，通常用Fresnel进行模拟的那个效果。",[11,264,265],{},[51,266],{"alt":267,"src":268},"image-20210119230505405_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230505405_thumb.png",[11,270,271],{},"最终效果是这样的：",[11,273,274],{},[51,275],{"alt":276,"src":277},"image-20210119230527413_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230527413_thumb.png",[150,279,281],{"id":280},"patten","Patten",[11,283,284],{},"这个不是很常见，是用于模仿漫画的那种类似网点的感觉：",[11,286,287],{},[51,288],{"alt":289,"src":290},"image-20210119230616663_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230616663_thumb.png",[11,292,293],{},[51,294],{"alt":295,"src":296},"image-20210119230707458_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119230707458_thumb.png",[11,298,299],{},"最终结果像是这样：",[11,301,302],{},[51,303],{"alt":304,"src":305},"image-20210119225712396_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119225712396_thumb.png",[83,307,308],{"id":308},"光照问题",[11,310,311],{},"光照模型选用的是SubSurface，虽然有尝试过Preintegrated Skin和Subsurface Profile，但是效果都有些微妙。",[11,313,314],{},"SubSurface存在一个问题，就是从上面来的DirectionalLight会对模型造成一种类似贯通的效果：",[11,316,317],{},[51,318],{"alt":319,"src":320},"image-20210119231317537_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119231317537_thumb.png",[11,322,323],{},"使用Mesh进行遮挡也无法取消掉这个效果，似乎是SubSurface光照模型的计算特性导致的。只能暂时放弃。",[11,325,326],{},"对于主导的DirectionalLight向上的时候，会出现阴影很重的感觉。只能通过限制光的角度，或者额外的打一些光来解决。",[11,328,329],{},"另外就是拟似计算的光照不够硬，通过调整自己的参数来解决：",[93,331,332,335,338],{},[96,333,334],{},"『Shadow Bias 』=>『1.0 』",[96,336,337],{},"『Shadow Slope Bias 』=>『0.0 』",[96,339,340],{},"『Shadow Filter Sharpe 』=>『1.0 』",[150,342,343],{"id":343},"法线整理",[11,345,346],{},"脸部不需要阴影，所以对模型进行处理，让法线全部朝向一个方向。",[11,348,349],{},[51,350],{"alt":351,"src":352},"image-20210119231922084_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119231922084_thumb.png",[11,354,355],{},"这种处理方式参照的是：",[74,357,358,361],{},[11,359,360],{},"GUILTY GEAR Xrd開発スタッフが送るアニメ調キャラモデリングTIPS",[11,362,363],{},[18,364,365],{"href":365,"rel":366},"https:\u002F\u002Fwww.slideshare.net\u002FASW_Yokohama\u002Fguilty-gear-xrdtips-124324946",[22],[150,368,369],{"id":369},"眼球高光",[11,371,372],{},"很强的那个高光是靠UnLit的材质内部计算出来的。",[11,374,375],{},[51,376],{"alt":377,"src":378},"image-20210119232139763_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119232139763_thumb.png",[11,380,381],{},"眼球有添加一个假的各向异性光照来提高立体感，根据光照的方向不同这个高光的位置会移动。",[150,383,385],{"id":384},"outline","OutLine",[11,387,388],{},"没有使用PostProcess，而是在Blender里面制作了一个反转的Mesh，直接包含在骨骼模型里面。",[11,390,391],{},"此外还提供了以下的功能：",[93,393,394,397,400,403],{},[96,395,396],{},"使用VertexColor来控制OutLine的粗细",[96,398,399],{},"轮廓线是带颜色的",[96,401,402],{},"根据摄像的距离调整粗细",[96,404,405],{},"根据FOV调整粗细",[11,407,408],{},"粗细控制基于Vertex Color，会使用Opacity Mask额外的处理，当数值小于0.1时，就不会绘制轮廓线。",[11,410,411],{},"不过主要的还是依靠将计算结果连接到World Position Offset进行的控制：",[11,413,414],{},[51,415],{"alt":416,"src":417},"image-20210119233127332_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119233127332_thumb.png",[11,419,420],{},"颜色则是通过UV查找基础颜色，并与另外准备的OutLine颜色进行叠加计算，实际进行的计算比较简单：",[11,422,423],{},[51,424],{"alt":425,"src":426},"image-20210119233437571_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119233437571_thumb.png",[11,428,429],{},"摄像的距离来调整Offset，这是通过内置的相机位置和Actor位置节点来计算的：",[11,431,432],{},[51,433],{"alt":434,"src":435},"image-20210119233551957_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119233551957_thumb.png",[11,437,438],{},"FOV也是类似的，直接用Hlsl的custom node去取出来：",[11,440,441],{},[51,442],{"alt":443,"src":444},"image-20210119233636756_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119233636756_thumb.png",[150,446,448],{"id":447},"textureinline","TextureInline",[11,450,451],{},"最后还使用了TextureInLine的技巧，实际上并不在OutLine的计算中，只是专门的准备了贴图，用于模拟一些不是很容易计算出来的描画效果。",[11,453,454],{},[51,455],{"alt":456,"src":457},"image-20210119233840764_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119233840764_thumb.png",[11,459,460],{},"并不是单纯的打包在角色贴图里面，而是另外有一张贴图，可以动态的在叠加时对RGBA通道进行强弱和颜色调整。计算节点：",[11,462,463],{},[51,464],{"alt":465,"src":466},"image-20210119233935788_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210119233935788_thumb.png",[83,468,470],{"id":469},"postprocess","PostProcess",[11,472,473],{},"主要不是介绍UE4本身的pp，而是指希望达到的一些后处理效果，主要有",[150,475,476],{"id":476},"模造纸效果",[11,478,479,484],{},[18,480,483],{"href":481,"rel":482},"https:\u002F\u002Fja.wikipedia.org\u002Fwiki\u002F%E3%83%91%E3%83%A9%E3%83%95%E3%82%A3%E3%83%B3%E7%B4%99",[22],"パラフィン紙","，一时找不到准确的术语翻译，就硬翻成模造纸吧。总之是一种纸，在上个世代的动画制作中用到。这种带颜色的透明的纸叠加到原画上，能够模拟出类似反光或者阴影的效果。",[11,486,487],{},"实现上使用了PP的Dirt Mask功能：",[11,489,490],{},[51,491],{"alt":492,"src":493},"image-20210120193421631_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210120193421631_thumb.png",[11,495,496],{},"贴图使用黑白的就ok了。",[150,498,499],{"id":499},"柔光滤镜",[11,501,502],{},"Diffusion Filter",[74,504,505],{},[11,506,507,508,512],{},"似乎是摄影术语，不是很明确是否采用了正确的翻译。虽然在镜片厂商看到的繁中译法是",[509,510,511],"em",{},"擴散濾光片","，但是其他一些地方又似乎分类为柔光滤镜。不纠结了……",[11,514,515],{},"总之就是这样一种滤镜，会将光线进行柔和的扩散，对降低图像在高光区域的对比度非常有效。据说可以在摄影时消除脸部的毛刺和皱纹，不是很确定是不是一个东西~",[11,517,518,519],{},"参考的这里：",[18,520,521],{"href":521,"rel":522},"https:\u002F\u002Ftwitter.com\u002Fmonsho1977\u002Fstatus\u002F670634806124920832",[22],[11,524,525],{},[51,526],{"alt":527,"src":528},"image-20210120195648749_thumb","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210120195648749_thumb.png",[11,530,531],{},"印象中虚幻应该也有模糊用的节点，可能有什么限制达不到需求吧。",[150,533,535],{"id":534},"kuwahara滤镜","Kuwahara滤镜",[11,537,538],{},"桑原道義老师所发明的平滑化用的滤镜。",[11,540,541],{},"能够让画面产生油画一样的效果，有利于让渲染结果看起来更接近动画的背景的感觉。",[11,543,544,545,550],{},"这边这篇介绍的很详细的实现方式：",[18,546,549],{"href":547,"rel":548},"https:\u002F\u002Fwww.raywenderlich.com\u002F100-unreal-engine-4-paint-filter-tutorial#toc-anchor-004",[22],"Unreal Engine 4 Paint Filter Tutorial","。",[150,552,554],{"id":553},"其他pp特效","其他PP特效",[11,556,557],{},"还列出了一些其他的后处理特效，应该都是默认的特效",[93,559,560,563,566,569,572,575,578,581,584],{},[96,561,562],{},"Cinematic DoF",[96,564,565],{},"Lens Flares",[96,567,568],{},"Bloom",[96,570,571],{},"Exposure",[96,573,574],{},"Chromatic Aberration",[96,576,577],{},"Vignette Intensity",[96,579,580],{},"Color Grading LUT",[96,582,583],{},"Motion Blur",[96,585,586],{},"etc ...",[83,588,589],{"id":589},"总结",[11,591,592],{},"总之在不使用自定义引擎特效的情况下达到了一开始设定的ToonShader的效果。",{"title":594,"searchDepth":595,"depth":596,"links":597},"",2,3,[598,599,606,612,618],{"id":85,"depth":595,"text":85},{"id":135,"depth":595,"text":135,"children":600},[601,602,603,604,605],{"id":152,"depth":596,"text":152},{"id":216,"depth":596,"text":216},{"id":237,"depth":596,"text":237},{"id":258,"depth":596,"text":259},{"id":280,"depth":596,"text":281},{"id":308,"depth":595,"text":308,"children":607},[608,609,610,611],{"id":343,"depth":596,"text":343},{"id":369,"depth":596,"text":369},{"id":384,"depth":596,"text":385},{"id":447,"depth":596,"text":448},{"id":469,"depth":595,"text":470,"children":613},[614,615,616,617],{"id":476,"depth":596,"text":476},{"id":499,"depth":596,"text":499},{"id":534,"depth":596,"text":535},{"id":553,"depth":596,"text":554},{"id":589,"depth":595,"text":589},"2021-01-24","md",{"layout":622,"status":623,"published":624,"author":625,"author_login":627,"author_email":628,"wordpress_id":629,"wordpress_url":630,"date_gmt":631,"excerpt":632},"post","publish",true,{"display_name":626,"login":627,"email":628,"url":594},"风铃","flinkor","flinkor@foxmail.com",3258,"\u002F?p=3258","2021-01-24 04:01:00 +0000",{"type":8,"value":633},[634],[11,635,13],{},"\u002F2021-01-24-ue4-fest-npr-note",{"title":6,"description":13},"_legacy\u002F2021\u002F2021-01-24-ue4-fest-npr-note",[640,641],"unreal fest","NPR","okWPDXLenIskJvqhFh5Rbfa9MxWxVV-ezWOKLVF8v64",{"id":644,"title":645,"body":646,"date":619,"description":650,"extension":620,"meta":967,"navigation":624,"path":976,"seo":977,"stem":978,"tags":979,"__hash__":980},"blogs\u002F_legacy\u002F2021\u002F2021-01-24-unreal-fest-trials-of-mana-3-note.md","UE4-Fest-圣剑传说3笔记",{"type":8,"value":647,"toc":948},[648,651,658,665,668,671,674,677,680,683,686,692,695,701,704,708,711,717,720,728,731,734,737,740,743,746,749,752,755,758,766,772,775,784,787,790,793,796,799,802,805,808,815,818,821,824,830,834,837,843,846,849,852,855,861,864,868,871,874,883,890,893,896,899,907,910,913,916,919,923,926,929,932,936,939,942,945],[11,649,650],{},"UEFest2020的圣剑传说3的分享",[11,652,653,654],{},"PPT参考的这里：",[18,655,656],{"href":656,"rel":657},"https:\u002F\u002Fwww.slideshare.net\u002FEpicGamesJapan\u002Funreal-festext2020winter-xeen",[22],[11,659,660,661],{},"后面才发现有原始视频：",[18,662,663],{"href":663,"rel":664},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=NHZRn4OHa1g",[22],[11,666,667],{},"最终使用引擎版本4.22.3",[11,669,670],{},"渲染方面没有使用任何引擎改造，全部使用引擎标准机能实现。",[83,672,673],{"id":673},"角色",[11,675,676],{},"美术上的参考主要有：原作的像素风格、插画。以及本作的插画。",[11,678,679],{},"从中寻找共通的魅力，以手绘的风格为目标进行制作。",[150,681,682],{"id":682},"轮廓线",[11,684,685],{},"轮廓线使用PostProcess来制作。",[11,687,688],{},[51,689],{"alt":690,"src":691},"image-20210117185504080","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117185504080_thumb.png",[11,693,694],{},"使用深度数据比较的方法来计算轮廓线，对于深度差别不大的地方，会并用Detail normal map进行角度比较，抽出轮廓线数据。",[11,696,697],{},[51,698],{"alt":699,"src":700},"image-20210117185821442","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117185821442_thumb.png",[11,702,703],{},"轮廓线的粗细使用World normal进行Mask来控制。",[150,705,707],{"id":706},"shading","Shading",[11,709,710],{},"使用NPR渲染，作为特征的Specular和阴影是在材质中实现的。",[11,712,713],{},[51,714],{"alt":715,"src":716},"image-20210117190629938","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117190629938_thumb.png",[11,718,719],{},"阴影的部分使用了两种颜色的阶调来进行实现，在计算的时候使用Rim进行遮罩，就能在原本的颜色上表现出RimLight的感觉。在对边界和背光进行表现时能够起作用。（这部分不是很确定是不是理解正确了……）",[11,721,722,723,727],{},"法线贴图在制作时会在Photoshop中使用滤镜来实现最终渲染时类似笔触的画风，这个应该和",[18,724,726],{"href":725},"\u002F2021-01-24-cedec-2016-sfv-note\u002F","街霸5的分享","里面提到的操作方法类似。但是使用的滤镜没有明确说明。",[150,729,730],{"id":730},"光照",[11,732,733],{},"在地图中使用一个Stationary的直射光作为天光来使用，其他的光照基本上都是static light。",[11,735,736],{},"对于每一个关卡，都有一个曲线来控制24小时的光照。",[150,738,739],{"id":739},"菜单画面",[11,741,742],{},"游戏中的菜单画面没有使用RenderTarget，而是直接进行3D绘制。",[11,744,745],{},"主要原因是开发时出于抗锯齿、处理负荷等因素，以及无法准备高分辨率的贴图等原因。",[11,747,748],{},"这样直接绘制的问题是，场景内的光照因素会反映到菜单画面来。",[11,750,751],{},"处理的方法是，首先使用light channel来避免被场景中的光达到。",[11,753,754],{},"同时从PostProcess中关闭GI的影响。",[11,756,757],{},"最后将r.SkyLightingQuality置为0。",[11,759,760,761,765],{},"消除掉环境的影响后，使用",[762,763,764],"strong",{},"Ambient Cubemaps","来添加光照。",[11,767,768],{},[51,769],{"alt":770,"src":771},"image-20210117195359304","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117195359304_thumb.png",[150,773,774],{"id":774},"动态装饰物体",[11,776,777,778,783],{},"混合使用了",[18,779,782],{"href":780,"rel":781},"https:\u002F\u002Fgithub.com\u002Fpafuhana1213\u002FKawaiiPhysics",[22],"KawaiiPhysics","与AnimDynamics。",[11,785,786],{},"使用KawaiiPhysics是因为其设置简单，动作起来很萌。",[11,788,789],{},"开发初期使用的是PhysicsAsset，由于初期性能优化不好，在帧率下降时，出现了穿模等一系列物理模拟不准确的问题，在各个平台上进行运行测试后，判断要使用需要花费的成本过高。",[11,791,792],{},"于是中期就切换到了AnimDynamics，虽然比PhysicsAsset要安定许多，但是在性能下降时还是会出现穿模的现象。为了达到理想的效果，进行了很多试错……",[11,794,795],{},"在开发终盘，性能已经稳定下来了。再次对PhysicsAsset进行验证，发现在帧率下降时还是会有穿模现象，同时从AnimDnamic切换过去会花费额外的成本，放弃使用了。",[11,797,798],{},"最后发现了KawaiiPhysics，KawaiiPhysics本身在帧率下降后的表现依然很稳定，很少发生穿模，形状出现问题的情况也必须少。与现存的AnimDynamic可以并用，替换的成本也较低，在终盘也能安定的进行。",[83,800,801],{"id":801},"程序编制",[150,803,804],{"id":804},"过场动画",[11,806,807],{},"圣剑传说3在游戏过程中，需要从6个主要角色中选择3个人来进行游戏。可组合的方式导致过场动画制作起来有不少的难度。在有的场景中，由于所选的角色组合不同，所播放的内容会有很大不同。",[11,809,810,811,814],{},"对应方法是，在",[509,812,813],{},"Sequencer","中使用一个专用的共通Actor来进行表演的设置，在游戏运行时。则将对应的角色替换到这个共通Actor中。这样就能让队伍的角色成员反映出来，也能保持玩家所携带的装备。",[11,816,817],{},"为了实现这一点，所有的角色都会采用一样的命名规范。在进行Sequencer播放时，会由代码按照规则取出对应角色的对应动画。各个角色的动画会通过转换器进行自动收集并输入到csv文件中，最终在UE4中加载成为DataTable。",[11,819,820],{},"语音台词和LipSync动画也遵循类似的规则进行取出。",[11,822,823],{},"动画在设置上，分为身体、眉毛、眼睛和嘴巴四个层次进行控制。",[11,825,826],{},[51,827],{"alt":828,"src":829},"image-20210117204320733","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117204320733_thumb.png",[150,831,833],{"id":832},"event","Event",[11,835,836],{},"有的时候，对于特定的组合而言，需要额外的播放一些场景。此时会对当前的角色进行判定，来决定是否播放特定的子动画。",[11,838,839],{},[51,840],{"alt":841,"src":842},"image-20210117204241149","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117204241149_thumb.png",[150,844,845],{"id":845},"视线和头的朝向",[11,847,848],{},"分为角度型和目标指定型的LookAt两种。",[11,850,851],{},"但是主角色的眼球大小会有所不同，所以需要设定眼睛的可达角度限制，在实际运行时进行控制。",[11,853,854],{},"由于各个角色的身高不同，所以根据角色的不同会使用不同的摄像。在Sequencer中会提供不同的角色的相机位置设置，可以在运行时进行取出。",[11,856,857],{},[51,858],{"alt":859,"src":860},"image-20210117205036407","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117205036407_thumb.png",[11,862,863],{},"似乎会通过代码进行CameraTrack的实时替换。",[150,865,867],{"id":866},"lipsync","LipSync",[11,869,870],{},"语音对应了日语和英语两种，分别有相应的LipSync数据。",[11,872,873],{},"规则上，要求台词的文本ID与语音的文件名一致。",[11,875,876,877,882],{},"使用SE的",[18,878,881],{"href":879,"rel":880},"https:\u002F\u002Fcedil.cesa.or.jp\u002Fcedil_sessions\u002Fview\u002F1742",[22],"Byblos","进行文本的管理。",[11,884,885,886,550],{},"LipSync使用了Oculus的OVRLipSync进行录制，参考这个",[18,887,888],{"href":888,"rel":889},"https:\u002F\u002Fpafuhana1213.hatenablog.com\u002Fentry\u002F2018\u002F11\u002F26\u002F011057",[22],[11,891,892],{},"对于录制的LipSync数据，必要的话会手工进行调整。",[11,894,895],{},"流程上，同样是使用转换器收集成csv并导入到UE4成为DataTable。",[11,897,898],{},"运行时在场景中生成时，由台词的文本显示同步触发：",[93,900,901,904],{},[96,902,903],{},"同名的语音文件播放",[96,905,906],{},"在对应的角色上播放LipSync动画",[83,908,909],{"id":909},"其他",[11,911,912],{},"避免使用资源的硬链接",[11,914,915],{},"使用Interface在设计上避免耦合。",[11,917,918],{},"蓝图C++化，由于游戏逻辑9成使用的都是蓝图，实际处理时风险过大。最后只将一部分比较重的逻辑移植到了C++中。",[150,920,922],{"id":921},"削减load时间比较有效的方法","削减Load时间比较有效的方法",[11,924,925],{},"玩家相关、特效相关、SE相关的常驻处理",[11,927,928],{},"Widget、图标贴图事先进行Cache缓存",[11,930,931],{},"防止不必要的资源进入地图",[150,933,935],{"id":934},"对于cpu性能改善比较有效的方法","对于CPU性能改善比较有效的方法",[11,937,938],{},"尽可能的关掉Tick，在新建项目的时候一起关掉，只有必要的Actor才Tick",[11,940,941],{},"复杂的处理果然还是放到C++里面比较快",[11,943,944],{},"PGO(Profile Guided Optimization)，利用游戏中的Profile结果进行最优化处理",[11,946,947],{},"URO(Enable Update Rate Optimizations)，对远离摄像的动画更新进行降频",{"title":594,"searchDepth":595,"depth":596,"links":949},[950,957,963],{"id":673,"depth":595,"text":673,"children":951},[952,953,954,955,956],{"id":682,"depth":596,"text":682},{"id":706,"depth":596,"text":707},{"id":730,"depth":596,"text":730},{"id":739,"depth":596,"text":739},{"id":774,"depth":596,"text":774},{"id":801,"depth":595,"text":801,"children":958},[959,960,961,962],{"id":804,"depth":596,"text":804},{"id":832,"depth":596,"text":833},{"id":845,"depth":596,"text":845},{"id":866,"depth":596,"text":867},{"id":909,"depth":595,"text":909,"children":964},[965,966],{"id":921,"depth":596,"text":922},{"id":934,"depth":596,"text":935},{"layout":622,"status":623,"published":624,"author":968,"author_login":627,"author_email":628,"wordpress_id":969,"wordpress_url":970,"date_gmt":971,"excerpt":972},{"display_name":626,"login":627,"email":628,"url":594},3243,"\u002F?p=3243","2021-01-24 04:08:31 +0000",{"type":8,"value":973},[974],[11,975,650],{},"\u002F2021-01-24-unreal-fest-trials-of-mana-3-note",{"title":645,"description":650},"_legacy\u002F2021\u002F2021-01-24-unreal-fest-trials-of-mana-3-note",[640,641],"w76ga3vPnRwZGTYJffVzsbZqAiFFfGMDM85SQ_10Ka8",1788763177414]