[{"data":1,"prerenderedAt":146},["ShallowReactive",2],{"\u002F2019-12-30-ue4-live2d-plugin-rewrite":3},{"id":4,"title":5,"body":6,"date":122,"description":12,"extension":123,"meta":124,"navigation":127,"path":139,"seo":140,"stem":141,"tags":142,"__hash__":145},"blogs\u002F_legacy\u002F2019\u002F2019-12-30-ue4-live2d-plugin-rewrite.md","重构Live2D插件",{"type":7,"value":8,"toc":111},"minimark",[9,13,16,19,23,26,29,32,35,38,41,52,55,58,61,65,68,71,74,77,80,83,86,89,92,96,99,102],[10,11,12],"p",{},"这个插件一直没有更新过，有些重要的功能也没有完成，最近好容易找到些时间。",[10,14,15],{},"由于和上一次的更新已经有了很长的时间，Live2D的SDK已经变化很大。",[10,17,18],{},"再加上打算换成新的渲染方式，所以干脆对整个插件进行了重写。",[20,21,22],"h2",{"id":22},"放弃的部分",[10,24,25],{},"首先，从目标上，放弃了编辑器支持。因为实质上Live2D的大部分编辑功能都是在官方的编辑器里面的，外部几乎没有什么可以控制的。而如果要做一些UE4这边的编辑器内控制的话，由于没有具体的需求，实在是很难把握分寸，反而会无端的投入时间。所以这一块就放弃了。",[10,27,28],{},"另外，也放弃了将所有的控制功能都接入到蓝图层面。这部分的工作其实就只是函数转发，但是也会无端的浪费劳动力，因为如何对Live2D的模型进行控制其实每个人在用的时候也会不一样吧。",[10,30,31],{},"因此，这边的主要工作就关注在Live2D模型的读取和渲染上了。",[20,33,34],{"id":34},"模型渲染",[10,36,37],{},"由于前次定的目标比较大，所以并没有在渲染上花太多的精力，直接使用了RenderTarget的Canvas绘制功能。",[10,39,40],{},"这样的缺点是，渲染的效率非常的低下。很难想象能够在移动平台上使用。",[10,42,43,44,51],{},"因此，这次使用了UE4后面提供的[",[45,46,50],"a",{"href":47,"rel":48},"https:\u002F\u002Fdocs.unrealengine.com\u002Fen-US\u002FProgramming\u002FRendering\u002FShaderInPlugin\u002FQuickStart\u002Findex.html",[49],"nofollow","Global Shader Plugin","]系统。",[10,53,54],{},"这个系统在官方的说明里面非常的简略，但是其实实际的作用还是非常强大的。",[10,56,57],{},"本次就是通过自定义的VertexShader和PixelShader来进行Live2D的模型绘制。由于之前对渲染管线的知识有很多一知半解的部分，这次算是遇到了不少坑，也学到了很多东西。",[10,59,60],{},"其中遇到的最大的两个坑先记录在这里，其他的部分感觉就只是在探索API的用法了……",[62,63,64],"h3",{"id":64},"参数传递",[10,66,67],{},"参数传递上有个不知道能不能算作是坑的地方，UE4这边VertexShader和PixelShader在例子里面是有作分别实现的。",[10,69,70],{},"但是实际如果要传递参数的话，参数必须在公共的基类里面声明，否则传递过去的值就会出现错乱。",[10,72,73],{},"尤其是在PixelShader这边的表现特别明显，会出现奇怪的结果。",[62,75,76],{"id":76},"绘制混乱",[10,78,79],{},"另一个问题就是RenderThread和GameThread的关系。",[10,81,82],{},"由于之前没有怎么接触过需要双边控制的逻辑，所以遇到了奇怪的问题。",[10,84,85],{},"最主要的问题是，GameThread在将任务发到RenderThread之后，并不会马上就执行。",[10,87,88],{},"在偶然的情况下，会出现GameThread进入第二次Update的时候，RenderThread里面的任务还没有执行完成。",[10,90,91],{},"这次遇到的就是，由于渲染还在进行中，GameThread却又进去更新了Live2D模型，导致渲染那边取到了错误的VertexBuffer，最后出现了奇怪的渲染结果。",[20,93,95],{"id":94},"todo","TODO",[10,97,98],{},"其实有些渲染的细节选项还没有接入，但是由于手头上没有用到对应功能的模型，就算做了也不知道效果是不是正确的。",[10,100,101],{},"这块也只能等到用到的时候再搞了，不过既然主体已经完成了的话，也不会有什么太大的工作量。",[10,103,104,105,110],{},"最后，插件的地址更新了，现在在[",[45,106,109],{"href":107,"rel":108},"https:\u002F\u002Fgithub.com\u002FArisego\u002FUnrealLive2D",[49],"这里","]。",{"title":112,"searchDepth":113,"depth":114,"links":115},"",2,3,[116,117,121],{"id":22,"depth":113,"text":22},{"id":34,"depth":113,"text":34,"children":118},[119,120],{"id":64,"depth":114,"text":64},{"id":76,"depth":114,"text":76},{"id":94,"depth":113,"text":95},"2019-12-30","md",{"layout":125,"status":126,"published":127,"author":128,"author_login":130,"author_email":131,"wordpress_id":132,"wordpress_url":133,"date_gmt":134,"excerpt":135},"post","publish",true,{"display_name":129,"login":130,"email":131,"url":112},"风铃","flinkor","flinkor@foxmail.com",2769,"\u002F?p=2769","2019-12-30 15:08:00 +0000",{"type":7,"value":136},[137],[10,138,12],{},"\u002F2019-12-30-ue4-live2d-plugin-rewrite",{"title":5,"description":12},"_legacy\u002F2019\u002F2019-12-30-ue4-live2d-plugin-rewrite",[143,144],"UE4","Live2D","kYMvcs0bNv3W-P72SsfYWsfTvFrQ6K1R_p_8aZx_feY",1788763179050]