将顶点输入流最终格式绑定放在MaterialInstance中,并改动相关类。
This commit is contained in:
@@ -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);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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 相关
|
||||
|
||||
|
@@ -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:
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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;}
|
||||
|
@@ -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
|
||||
|
@@ -14,7 +14,6 @@ struct ShaderStage
|
||||
uint location;
|
||||
|
||||
VertexAttribType type; ///<成份数量(如vec4中的4)
|
||||
VkFormat format; ///<对应的Vulkan格式(如vec4对应的FMT_RGBA32F)
|
||||
|
||||
uint binding;
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user