ULRE/src/SceneGraph/StaticRenderManage.md

1.9 KiB
Raw Blame History

静态渲染管理

静态渲染的意义是什么?

静态渲染管理中的“静态”并不是指在场景中静止不动的所有物件,而是说大部分时间都会出现在场景中的物件。它包含地形、花草树木、房屋、常见人物,武器装备等等。如果归划好,可以将绝大部分的物件都划入静态渲染中。

它的意义为的是所有添加进管理器的模型原始资源,都会一直存在。与它们本身是否显示在画面中,并无关联。为的是避开对显存资源的动态调配。

在静态渲染管理器中的所有模型,会根据顶点数据格式(Vertex Input Format)分类。每种格式所有模型共用一套超大VBO(Vertex Buffer Object)以达到在渲染时渲染不同模型不会切换VBO的效果并进一步达成“一个格式一次Drawcall全部画完”的极致效果。

材质的定义

1.Material 材质可以简单理解为是Shader的包装。

2.Material Instance 材质实例是指同一材质下,不同的参数配置。

我们需要做什么?

1.在Shader中建立两个UBO或SSBO

//一个用于存所有Local to World矩阵的数组

#define MI_MAX_COUNT (UBORange/sizeof(mat4))

layout(set=?,binding=?) uniform LocalToWorldData
{
    mat4 mats[L2W_MAX_COUNT];
}l2w;
//一个用于存所有MaterialInstance数据的数组

#define MI_MAX_COUNT (UBORange/sizeof(MaterialInstance))

layout(set=?,binding=?) uniform MaterialInstanceData
{
    MaterialInstance mi_array[MI_MAX_COUNT];
}mi;

2.建立一个RG8UI或RG16UI的Vertex Input Stream,用于保存访问LocalToWorld/MaterialInstance的索引

layout(location=?) in uvec2 Assign;     //Local To World矩阵ID与材质ID输入数据流

mat4 GetLocalToWorld()
{
    return l2w.mats[Assign.x];
}

MaterialInstance GetMaterialInstance()
{
    return mi.mi_array[Assign.y];
}