将顶点输入流最终格式绑定放在MaterialInstance中,并改动相关类。

This commit is contained in:
2021-11-29 20:12:10 +08:00
parent 424b4b8a6f
commit f55186a9c8
23 changed files with 202 additions and 195 deletions

View File

@@ -23,7 +23,7 @@ namespace hgl
}
};//struct ShaderStageBind
using VADMaps=MapObject<AnsiString,ShaderStageBind>;
using ShaderStageBindMap=MapObject<AnsiString,ShaderStageBind>;
/**
* 可渲染对象创建器
@@ -35,22 +35,18 @@ namespace hgl
RenderResource *db;
Material *mtl;
const VertexShaderModule *vsm;
const VAB *vab;
protected:
uint32 vertices_number;
uint32 vertices_number;
IndexBuffer * ibo;
VADMaps vab_maps;
protected:
virtual VAD *CreateVAD(const AnsiString &name,const ShaderStage *ss); ///<创建一个顶点属性缓冲区
IndexBuffer * ibo;
ShaderStageBindMap ssb_map;
public:
RenderableCreater(RenderResource *sdb,Material *m);
RenderableCreater(RenderResource *sdb,const VAB *);
virtual ~RenderableCreater()=default;
virtual bool Init(const uint32 count); ///<初始化,参数为顶点数量
@@ -60,12 +56,9 @@ namespace hgl
template<typename T>
T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器
{
const ShaderStage *ss=vsm->GetStageInput(name);
const VkFormat format=vab->GetFormat(name);
if(!ss)
return(nullptr);
if(ss->format!=T::GetVulkanFormat())
if(format!=T::GetVulkanFormat())
return(nullptr);
VAD *vad=this->CreateVAD(name);

View File

@@ -115,6 +115,18 @@ struct PipelineData;
enum class InlinePipeline;
class Pipeline;
struct VAConfig
{
VkFormat format;
bool instance;
public:
CompOperatorMemcmp(const VAConfig &);
};
using VABConfigInfo=Map<AnsiString,VAConfig>;
class VertexAttributeBinding;
using VAB=VertexAttributeBinding;

View File

@@ -207,7 +207,7 @@ public: //shader & material
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
MaterialInstance *CreateMI(Material *);
MaterialInstance *CreateMI(Material *,const VABConfigInfo *vab_cfg=nullptr);
public: //Command Buffer 相关

View File

@@ -5,7 +5,6 @@
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKVertexAttributeBinding.h>
VK_NAMESPACE_BEGIN
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
@@ -17,7 +16,6 @@ struct MaterialData
MaterialDescriptorSets *mds;
VertexShaderModule *vertex_sm;
VertexAttributeBinding *vab;
ShaderStageCreateInfoList shader_stage_list;
@@ -56,15 +54,13 @@ public:
const UTF8String & GetName ()const{return data->name;}
const VertexShaderModule * GetVertexShaderModule ()const{return data->vertex_sm;}
VertexShaderModule * GetVertexShaderModule () {return data->vertex_sm;}
const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;}
const MaterialDescriptorSets * GetDescriptorSets ()const{return data->mds;}
const VkPipelineLayout GetPipelineLayout ()const;
const PipelineLayoutData * GetPipelineLayoutData ()const{return data->pipeline_layout_data;}
const VertexAttributeBinding * GetVAB ()const{return data->vab;}
public:

View File

@@ -8,13 +8,15 @@ class MaterialInstance
{
Material *material;
VAB *vab;
MaterialParameters *mp_value;
private:
friend class GPUDevice;
MaterialInstance(Material *,MaterialParameters *);
MaterialInstance(Material *,VAB *,MaterialParameters *);
public:
@@ -22,6 +24,7 @@ public:
Material *GetMaterial(){return material;}
const VAB *GetVAB()const{return vab;}
MaterialParameters *GetMP(){return mp_value;}
MaterialParameters *GetMP(const DescriptorSetsType &type);
};//class MaterialInstance

View File

@@ -35,6 +35,8 @@ public:
operator VkPipeline(){return pipeline;}
const VAB *GetVAB()const{return data->GetVAB();}
const bool IsAlphaTest()const{return data->alpha_test>0;}
const bool IsAlphaBlend()const{return data->alpha_blend;}
};//class GraphicsPipeline

View File

@@ -52,16 +52,13 @@ public:
public:
Pipeline *CreatePipeline(const Material *, PipelineData *);
Pipeline *CreatePipeline(const Material *,const InlinePipeline &);
Pipeline *CreatePipeline(MaterialInstance *, PipelineData *);
Pipeline *CreatePipeline(MaterialInstance *,const InlinePipeline &);
public:
Pipeline *CreatePipeline(Material *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false);
Pipeline *CreatePipeline(Material *, PipelineData *, const Prim &prim,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, PipelineData *, const Prim &prim,const bool prim_restart=false);
Pipeline *CreatePipeline(Material *, const OSString &, const Prim &prim,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const Prim &prim,const bool prim_restart=false);
};//class RenderPass
VK_NAMESPACE_END

View File

@@ -14,17 +14,17 @@ VK_NAMESPACE_BEGIN
*/
class Renderable
{
struct VABData
struct VBOData
{
VBO *buf;
VkDeviceSize offset;
public:
CompOperatorMemcmp(const VABData &);
CompOperatorMemcmp(const VBOData &);
};
Map<UTF8String,VABData> buffer_list;
Map<AnsiString,VBOData> buffer_list;
protected:
@@ -56,7 +56,7 @@ public:
void SetBoundingBox(const AABB &aabb){BoundingBox=aabb;}
const AABB &GetBoundingBox()const {return BoundingBox;}
bool Set(const UTF8String &name,VBO *vb,VkDeviceSize offset=0);
bool Set(const AnsiString &name,VBO *vb,VkDeviceSize offset=0);
bool Set(IndexBuffer *ib,VkDeviceSize offset=0)
{
@@ -78,8 +78,8 @@ public:
return draw_count;
}
VBO * GetVBO (const UTF8String &,VkDeviceSize *);
VkBuffer GetBuffer (const UTF8String &,VkDeviceSize *);
VBO * GetVBO (const AnsiString &,VkDeviceSize *);
VkBuffer GetBuffer (const AnsiString &,VkDeviceSize *);
const int GetBufferCount ()const {return buffer_list.GetCount();}
IndexBuffer * GetIndexBuffer () {return indices_buffer;}

View File

@@ -47,8 +47,6 @@ public:
const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;}
};//class ShaderModule
class VertexAttributeBinding;
/**
* 顶点Shader模块<br>
* 由于顶点shader在最前方执行所以它比其它shader多了VertexInput的数据
@@ -56,12 +54,13 @@ class VertexAttributeBinding;
class VertexShaderModule:public ShaderModule
{
uint32_t attr_count;
VkVertexInputBindingDescription *binding_list;
VkVertexInputAttributeDescription *attribute_list;
VertexAttribType *type_list;
const AnsiString **name_list;
ShaderStage **ssi_list;
private:
Sets<VertexAttributeBinding *> vab_sets;
Sets<VAB *> vab_sets;
public:
@@ -76,17 +75,17 @@ public:
const uint GetStageInputCount () const{return shader_resource->GetStageInputCount();}
const ShaderStageList & GetStageInputs () const{return shader_resource->GetStageInputs();}
const uint32_t GetAttrCount()const{return attr_count;}
//const uint32_t GetAttrCount()const{return attr_count;}
const VkVertexInputBindingDescription * GetDescList ()const{return binding_list;}
const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;}
//const VkVertexInputBindingDescription * GetDescList ()const{return binding_list;}
//const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;}
const VkVertexInputBindingDescription * GetDesc (const uint32_t index)const{return (index>=attr_count?nullptr:binding_list+index);}
const VkVertexInputAttributeDescription * GetAttr (const uint32_t index)const{return (index>=attr_count?nullptr:attribute_list+index);}
//const VkVertexInputBindingDescription * GetDesc (const uint32_t index)const{return (index>=attr_count?nullptr:binding_list+index);}
//const VkVertexInputAttributeDescription * GetAttr (const uint32_t index)const{return (index>=attr_count?nullptr:attribute_list+index);}
public:
VAB * CreateVAB();
VAB * CreateVAB(const VABConfigInfo *format_map=nullptr);
bool Release(VAB *);
const uint32_t GetInstanceCount()const{return vab_sets.GetCount();}
};//class VertexShaderModule:public ShaderModule

View File

@@ -14,7 +14,6 @@ struct ShaderStage
uint location;
VertexAttribType type; ///<成份数量(如vec4中的4)
VkFormat format; ///<对应的Vulkan格式(如vec4对应的FMT_RGBA32F)
uint binding;

View File

@@ -69,11 +69,12 @@ namespace hgl
/**
* 根据格式要求,创建对应的顶点属性数据区(VAD)
* @param base_type 基础格式
* @param vecsize vec数量
* @param vertex_count 顶点数量
* @param vertex_count 顶点数量
* @param fmt Vulkan格式
* @param vec_size vec数量
* @param stride 单个数据字节数
*/
VAD *CreateVertexAttribData(const VertexAttribType *,const uint32_t vertex_count);
VAD *CreateVertexAttribData(const uint32_t vertex_count,const VkFormat fmt,const int vec_size,const uint stride);
//这个函数比较重要就不搞成CreateVAD的简写了
}//namespace graph
}//namespace hgl