绘制结构的作用
在UnrealEngine4中,对于一个绘制Mesh的drawcall需要的所有信息(VertexBuffer,IndicesBuffer,Shaders,PipelineState等)用一个MeshDrawCommand结构体打包,然后添加到List中依次执行MeshDrawCommand进行drawcall调用,因此,本质上对于绘制一个Mesh来说,就是在创建一系列MeshDrawCommand,你可能会好奇,为何是一系列,而不是一个?因为MeshA可能需要创建一个MeshDrawCommand用于BasePass阶段(这个MeshDrawCommand可能就包含了BasePass阶段需要的Shaders和对应参数),然后这个MeshA可能还需要创建一个MeshDrawCommand用于ShadowMapPass阶段(这个MeshDrawCommand包含的Shaders和对应参数显然与BasePass又不一样,但是VertexBuffer和IndicesBuffer可能是一样的,你很好奇,为何VB和IB不一定是一样的呢?因为生成ShadowMap可能使用一个代理简化网格体数据,同时PipelineState与BasePass可能也不一样),总之,一个MeshA可以为好几种Pass阶段生成对应需要的MeshDrawCommand。
生成绘制结构体的内置工具函数
我们可以直接手动获取shaders,设置参数,绑定管线状态这样手动要创建一个MeshDrawCommand,但是通常我们使用FMeshPassProcessor::BuildMeshDrawCommands()函数来生成一个mesh的MeshDrawCommands(这里加了s,也就是说,一个Mesh实际上可能包含多个section,section的意思简单来说,比如一个obj模型文件,整个obj表示一个Geometry,在ue4这里就是整个obj模型表示一个mesh,然后这个mesh里面显然可能会包含使用不同材质或分组的块数据),这个函数的原型如下:
1 template<typename PassShadersType, typename ShaderElementDataType> 2 void BuildMeshDrawCommands( 3 const FMeshBatch& RESTRICT MeshBatch, 4 uint64 BatchElementMask, 5 const FPrimitiveSceneProxy* RESTRICT PrimitiveSceneProxy, 6 const FMaterialRenderProxy& RESTRICT MaterialRenderProxy, 7 const FMaterial& RESTRICT MaterialResource, 8 const FMeshPassProcessorRenderState& RESTRICT DrawRenderState, 9 PassShadersType PassShaders, 10 ERasterizerFillMode MeshFillMode, 11 ERasterizerCullMode MeshCullMode, 12 FMeshDrawCommandSortKey SortKey, 13 EMeshPassFeatures MeshPassFeatures, 14 const ShaderElementDataType& ShaderElementData);
这里,可以看到函数参数就包含了可以创建一个MeshDrawCommand的所有信息(shaders,pipelineState,shaderParamters(也就是shaderElementData),mesh本身数据)。
生成MeshDrawCommand的一般形式
按UE4的架构封装,我们需要继承FMeshPassProcessor类,重载AddMeshBatch函数,这个函数会在对应实际被调用,然后可以在这个函数中调用BuildMeshDrawCommands函数来生成MeshDrawCommands。
可以参考HairStrandsVisibility.cpp的AddMeshBatch函数,来快速copy到自己新创建的函数中,进行修改以便快速开发。
标签:const,函数,创建,RESTRICT,UnrealEngine4,图形,绘制,MeshDrawCommand From: https://www.cnblogs.com/JhonKkk/p/17053509.html