我专栏的目录
小IVan:专题概述及目录本节使用的是UE4.17,如果使用4.19或以上版本的话会有一些不同。UE4.19又把这些封装了一下。从原理上为了解释清楚我还是选择了比较原始的4.17版本。后面的章节会把它改造成现在的版本。
还是先上效果吧
上篇文章分析了虚幻自带的CableComponent并且在unity中重现了CableComponent,这篇将开始着手自己进行图元汇编的编程。我们先做一个简单的,后续再慢慢做一些比较好玩的图元汇编相关的效果。
首先我们先建一个新的插件
我给它命名为RayLine,你也可以给它叫个什么其他名字,然后在插件里加一个头文件和源文件
然后在Build.cs文件里引入我们需要的模块
然后我们在RayBasicComponent.h中键入我们的新类型
我随便定义了一个结构体。
然后我们来定义我们的组件类型
我们的这个类型继承自UMeshComponent,然后有一个RAYLINE_API类导出宏,这个宏的名字必须和我们模块的名字保持一致,我们的模块就是我们的插件啦。
然后我们声明了一个GENERATED_UCLASS_BODY(),这个宏会帮我们自动生成默认构造函数,我们这里如果再敲构造函数,编译器就会报错了,所以我们这里什么都不需要干,如果我们这里使用的是GENERATED_BODY()宏的话就需要写构造函数了。
然后我声明了一个变量DebugSec并给他UPROPERTY宏,这样编辑器就能认识它了,它也会被纳入垃圾回收里。
然后我们重写了virtual FPrimitiveSceneProxy* CreateSceneProxy() override函数,这个函数创建场景代理,场景代理的作用就是负责在渲染线程端把逻辑线程这边的数据压入渲染管线,下面我画个图感受一下:
我们这里只需要管到把我们的模型加入渲染队列就可以了(红圈圈起来的部分),至于后面的事情就是引擎帮我们处理了,当然如果你不想使用引擎的渲染管线把后面一大片自己撸一套新机制出来也行。
然后来到我们的RayBasicComponent.cpp
我们先把需要的头文件包含进来
然后定义我们的顶点缓冲区,注意这个和Shader篇的顶点着色器是两个东西哈。
然后是我们的索引缓冲区
然后是顶点输入布局
然后是一个结构体,把它视作一个数据包,方便我们从逻辑层把数据们打包一起发送到渲染线程