在遍历所有Window及所包含的所有非Collapse子控件,需要渲染的内容由子控件以FSlateDrawElement的数据结构在WindowElementList中。随后WindowElementList中FSlateDrawElement数据会被转换成方便硬件识别的数据FElementBatcher。最后,新开线程,进行渲染。
![](https://i-blog.csdnimg.cn/blog_migrate/edde940be9e05b13aca63353705bd2d6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6098873bea7b7acfc04d483434fac3d7.png)
DrawWindows_Private Phase 1:
![](https://i-blog.csdnimg.cn/blog_migrate/e48ec77165cbb69254f8083a660842e0.png)
DrawWindows_Private Phase 2:
![](https://i-blog.csdnimg.cn/blog_migrate/a266ee5fc32fc83e8cf17d993fb779f6.png)
FSlateDrawElement
在游戏线程(GamingThread)中,叶控件(SLeafWidget)和部分的复合控件(SCompoundWidget)会向WindowElementList (SlateApplication以参数&OutDrawElements的形式传入子控件)中添加FSlateDrawElement类型的数据。
![](https://i-blog.csdnimg.cn/blog_migrate/a38101bb9bba581046155a8b5ee90739.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1fa2964f1f6b4e081f92dbacd163ff14.png)
![](https://i-blog.csdnimg.cn/blog_migrate/891b9f273957b68185630b2e913705f8.png)
其中包含的主要属性:
// 结构体,里面包含渲染资源&着色器等资源类型的信息 FSlateDataPayload DataPayload; // 位置大小等几何信息 FSlateRenderTransform RenderTransform; FTransform2D LayoutToRenderTransform; FVector2D Position; FVector2D LocalSize; float Scale; // 渲染层级 uint32 Layer; // 位掩码,渲染时应用于该元素的效果 ESlateDrawEffect DrawEffects; // 枚举,该元素的类型,上图中,STextSlate和SImage的就是ET_Box类型 // SRadarChart中的是ET_Line类型 EElementType ElementType;
|
FElementBatcher
FElementBatcher的主要属性是FSlateBatchData* BatchData, 这个指针的实体存在于传入的WindowElementList中。
FSlateBatchData包含了元素渲染需要的 Triangle的 vertex 与 index 列表信息
FElementBatcher根据当前传入元素的不同类型类型进行不同的处理。比如,对于Box类型,会做如下图的拆分。
这些9个顶点的vertex列表,和组成Quad、Triangle信息的index列表会放入到BatchData中。
有了详细的几何体信息,渲染管线就可以愉快地组装图元、光栅化什么的了。
处于相同绘制层的元素,共用一个BatchData。每个BatchData在渲染时会调用一个DrawCall. 即 Num(DrawLayer) = Num(BatchData) = Num(DrawCall)