[{"data":1,"prerenderedAt":311},["ShallowReactive",2],{"page-Live2D-1":3,"page-count-Live2D":114},[4,147],{"id":5,"title":6,"body":7,"date":123,"description":13,"extension":124,"meta":125,"navigation":128,"path":140,"seo":141,"stem":142,"tags":143,"__hash__":146},"blogs\u002F_legacy\u002F2019\u002F2019-12-30-ue4-live2d-plugin-rewrite.md","重构Live2D插件",{"type":8,"value":9,"toc":112},"minimark",[10,14,17,20,24,27,30,33,36,39,42,53,56,59,62,66,69,72,75,78,81,84,87,90,93,97,100,103],[11,12,13],"p",{},"这个插件一直没有更新过，有些重要的功能也没有完成，最近好容易找到些时间。",[11,15,16],{},"由于和上一次的更新已经有了很长的时间，Live2D的SDK已经变化很大。",[11,18,19],{},"再加上打算换成新的渲染方式，所以干脆对整个插件进行了重写。",[21,22,23],"h2",{"id":23},"放弃的部分",[11,25,26],{},"首先，从目标上，放弃了编辑器支持。因为实质上Live2D的大部分编辑功能都是在官方的编辑器里面的，外部几乎没有什么可以控制的。而如果要做一些UE4这边的编辑器内控制的话，由于没有具体的需求，实在是很难把握分寸，反而会无端的投入时间。所以这一块就放弃了。",[11,28,29],{},"另外，也放弃了将所有的控制功能都接入到蓝图层面。这部分的工作其实就只是函数转发，但是也会无端的浪费劳动力，因为如何对Live2D的模型进行控制其实每个人在用的时候也会不一样吧。",[11,31,32],{},"因此，这边的主要工作就关注在Live2D模型的读取和渲染上了。",[21,34,35],{"id":35},"模型渲染",[11,37,38],{},"由于前次定的目标比较大，所以并没有在渲染上花太多的精力，直接使用了RenderTarget的Canvas绘制功能。",[11,40,41],{},"这样的缺点是，渲染的效率非常的低下。很难想象能够在移动平台上使用。",[11,43,44,45,52],{},"因此，这次使用了UE4后面提供的[",[46,47,51],"a",{"href":48,"rel":49},"https:\u002F\u002Fdocs.unrealengine.com\u002Fen-US\u002FProgramming\u002FRendering\u002FShaderInPlugin\u002FQuickStart\u002Findex.html",[50],"nofollow","Global Shader Plugin","]系统。",[11,54,55],{},"这个系统在官方的说明里面非常的简略，但是其实实际的作用还是非常强大的。",[11,57,58],{},"本次就是通过自定义的VertexShader和PixelShader来进行Live2D的模型绘制。由于之前对渲染管线的知识有很多一知半解的部分，这次算是遇到了不少坑，也学到了很多东西。",[11,60,61],{},"其中遇到的最大的两个坑先记录在这里，其他的部分感觉就只是在探索API的用法了……",[63,64,65],"h3",{"id":65},"参数传递",[11,67,68],{},"参数传递上有个不知道能不能算作是坑的地方，UE4这边VertexShader和PixelShader在例子里面是有作分别实现的。",[11,70,71],{},"但是实际如果要传递参数的话，参数必须在公共的基类里面声明，否则传递过去的值就会出现错乱。",[11,73,74],{},"尤其是在PixelShader这边的表现特别明显，会出现奇怪的结果。",[63,76,77],{"id":77},"绘制混乱",[11,79,80],{},"另一个问题就是RenderThread和GameThread的关系。",[11,82,83],{},"由于之前没有怎么接触过需要双边控制的逻辑，所以遇到了奇怪的问题。",[11,85,86],{},"最主要的问题是，GameThread在将任务发到RenderThread之后，并不会马上就执行。",[11,88,89],{},"在偶然的情况下，会出现GameThread进入第二次Update的时候，RenderThread里面的任务还没有执行完成。",[11,91,92],{},"这次遇到的就是，由于渲染还在进行中，GameThread却又进去更新了Live2D模型，导致渲染那边取到了错误的VertexBuffer，最后出现了奇怪的渲染结果。",[21,94,96],{"id":95},"todo","TODO",[11,98,99],{},"其实有些渲染的细节选项还没有接入，但是由于手头上没有用到对应功能的模型，就算做了也不知道效果是不是正确的。",[11,101,102],{},"这块也只能等到用到的时候再搞了，不过既然主体已经完成了的话，也不会有什么太大的工作量。",[11,104,105,106,111],{},"最后，插件的地址更新了，现在在[",[46,107,110],{"href":108,"rel":109},"https:\u002F\u002Fgithub.com\u002FArisego\u002FUnrealLive2D",[50],"这里","]。",{"title":113,"searchDepth":114,"depth":115,"links":116},"",2,3,[117,118,122],{"id":23,"depth":114,"text":23},{"id":35,"depth":114,"text":35,"children":119},[120,121],{"id":65,"depth":115,"text":65},{"id":77,"depth":115,"text":77},{"id":95,"depth":114,"text":96},"2019-12-30","md",{"layout":126,"status":127,"published":128,"author":129,"author_login":131,"author_email":132,"wordpress_id":133,"wordpress_url":134,"date_gmt":135,"excerpt":136},"post","publish",true,{"display_name":130,"login":131,"email":132,"url":113},"风铃","flinkor","flinkor@foxmail.com",2769,"\u002F?p=2769","2019-12-30 15:08:00 +0000",{"type":8,"value":137},[138],[11,139,13],{},"\u002F2019-12-30-ue4-live2d-plugin-rewrite",{"title":6,"description":13},"_legacy\u002F2019\u002F2019-12-30-ue4-live2d-plugin-rewrite",[144,145],"UE4","Live2D","kYMvcs0bNv3W-P72SsfYWsfTvFrQ6K1R_p_8aZx_feY",{"id":148,"title":149,"body":150,"date":296,"description":154,"extension":124,"meta":297,"navigation":128,"path":306,"seo":307,"stem":308,"tags":309,"__hash__":310},"blogs\u002F_legacy\u002F2018\u002F2018-05-09-ue4-live2d-plugin.md","UE4的Live2D插件",{"type":8,"value":151,"toc":287},[152,155,158,161,164,167,171,179,182,185,188,192,195,198,201,204,206,209,222,225,229,238,253,256,265,268,271,274],[11,153,154],{},"Live2D这个技术在公布之后在各种游戏中有使用的痕迹，不过在提供动态的同时还是损失了些许立绘的精细感。",[11,156,157],{},"当前UE4版本为4.19.1。",[11,159,160],{},"Live2D在Unity上是有提供插件的，在近期Cubism的SDK进行结构更新之后，其在其他类型的项目中的接入就变得更加轻松了。",[11,162,163],{},"因此便动了接入UE4插件的念头，不想工作量比想象中的稍微大了一些，再加上最近可用的业余时间变少了，打算将所有的时间集中到一个方面，便只能将这个插件以WIP的形式先放出来了。",[11,165,166],{},"由于短时间内在项目内可能不会用到Live2D，可能更新频率会很低呢~",[21,168,170],{"id":169},"cubism-sdk","Cubism SDK",[11,172,173,174,178],{},"目前可以在项目中使用的Live2D的SDK可以从[",[46,175,110],{"href":176,"rel":177},"https:\u002F\u002Flive2d.github.io\u002F#native",[50],"]下载，由于Cubism最近又出了一款产品，所以其产品主页上的说明有些没有理解。",[11,180,181],{},"由于本身没有进行过Live2D的制作，也没有购买过官方的License，所以在接入测试中使用的是官方测试用的Mark的Live2D模型。",[11,183,184],{},"Live2D的SDK在变更之前，模型动画的渲染和更新是混合在一起的，虽然可以很方便的直接取到渲染结果贴图。",[11,186,187],{},"但是由于渲染的路径是SDK自己控制的，导致在集成到UE4这样的引擎中会有很多心理和时间上的额外成本。",[21,189,191],{"id":190},"ue4的接入","UE4的接入",[11,193,194],{},"变更后的SDK的核心部分只负责对模型进行更新，所以在接入时只需要通过接口函数来进行更新和结果获取就可以了。",[11,196,197],{},"在实现上其实并没有什么太多可以解释的地方，基本上参照官方文档进行一一对接就可以了。",[11,199,200],{},"目前已经实现了Live2D的moc3模型的导入和使用，在使用上模型的渲染Object会有一个RenderTarget，直接将其用于材质或者UI就可以了。",[11,202,203],{},"在渲染时由于SDK那边推过来的时候是大量的Vertex和Index的数据，所以使用了UCanvasRenderTarget。这个类本身是会对Texture进行Batch操作的，但是有一个问题，就是Live2D的Mask类型的渲染方式并不被UCanvaRenderTarget的DrawTriangle所支持，所以必须使用额外的材质来进行Blend的操作。",[63,205,96],{"id":95},[11,207,208],{},"目前剩下的工作主要有三个方面：",[210,211,212,216,219],"ul",{},[213,214,215],"li",{},"没有将模型操作的接口接入，要使用的话必须调用SDK的原生接口",[213,217,218],{},"寻找更高效的渲染方式",[213,220,221],{},"另外就是编辑器的支持，现在打开导入的资源的话，编辑界面是无法使用的，由于需要处理的细节部分比较多而且也没有详细的研究过需要在编辑器中进行控制的项目，所以没有填入内容。不过并不会影响在项目中使用这个资源~",[11,223,224],{},"总体上而言只完成了核心的部分，如果需要在项目中使用的话还需要自己进行一点操作。",[63,226,228],{"id":227},"sample","Sample",[11,230,231,232,237],{},"由于是WIP，所以使用起来会有些繁琐，请直接看[",[46,233,236],{"href":234,"rel":235},"https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1P1DXeIXRmw2czRlpIzt60Q",[50],"Sample项目","(y8a2)]。下面是详细的说明：",[239,240,241,244,247,250],"blockquote",{},[11,242,243],{},"使用上只需要使用UCubismBpLib::CreateCubism就可以了，对于取得之后的Live2D渲染器，必须为其指定贴图。",[11,245,246],{},"由于不是很清楚Live2D实际在进行模型输出时贴图是如何进行规范命名的，所以这里需要进行一次额外的导入。",[11,248,249],{},"如果Texture的命名必然和模型对应的话，之后可以考虑直接在导入时进行引入。",[11,251,252],{},"在蓝图或者代码中完成构建和贴图指定之后，就可以通过Get_RenderTarget来获取渲染的结果的RenderTarget了。",[63,254,255],{"id":255},"链接",[11,257,258,259,264],{},"插件本体的连接在[",[46,260,263],{"href":261,"rel":262},"https:\u002F\u002Fgithub.com\u002FArisego\u002Flivv.git",[50],"GitHub","]上~",[11,266,267],{},"说到ACG相关的插件，有的童鞋可能知道，其实之前有在做MMD的导入插件，但是后面有两个问题：UE4目前不支持在动画序列中原生的IK动画；要在UE4中实现MMD的一些特殊骨骼绑定例如QDEF之类的需要额外的工作量。所以虽然基本的导入和动画功能都实现了，但是这两个问题导致实质上没有办法推进了，目前是停止的状态呢。",[21,269,270],{"id":270},"更新",[11,272,273],{},"由于两次更新尝试之间的时间间隔相差太大，所以对插件进行了整个的重写。现在的渲染效率提高了～",[11,275,276,277,281,282,286],{},"[",[46,278,280],{"href":108,"rel":279},[50],"插件地址","][",[46,283,285],{"href":284},"\u002F2019-12-30-ue4-live2d-plugin-rewrite\u002F","文章更新","]",{"title":113,"searchDepth":114,"depth":115,"links":288},[289,290,295],{"id":169,"depth":114,"text":170},{"id":190,"depth":114,"text":191,"children":291},[292,293,294],{"id":95,"depth":115,"text":96},{"id":227,"depth":115,"text":228},{"id":255,"depth":115,"text":255},{"id":270,"depth":114,"text":270},"2018-05-09",{"layout":126,"status":127,"published":128,"author":298,"author_login":131,"author_email":132,"wordpress_id":299,"wordpress_url":300,"date_gmt":301,"excerpt":302},{"display_name":130,"login":131,"email":132,"url":113},2345,"\u002F?p=2345","2018-05-09 13:51:31 +0000",{"type":8,"value":303},[304],[11,305,154],{},"\u002F2018-05-09-ue4-live2d-plugin",{"title":149,"description":154},"_legacy\u002F2018\u002F2018-05-09-ue4-live2d-plugin",[144,145],"SUN0GOghLNTCDMw9K4ziI14eOBF_JtCPKXpNCmi45Yc",1788763179094]