few about MaterialInstance

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-06-05 21:39:12 +08:00
parent 9d3ea89861
commit ffaa6b5362
9 changed files with 52 additions and 37 deletions

View File

@ -23,11 +23,14 @@ constexpr float position_data[VERTEX_COUNT*2]=
0.1, 0.9
};
constexpr float color_data[3][4]=
constexpr float color_data[6][4]=
{
{1,0,0,1},
{1,1,0,1},
{0,1,0,1},
{0,0,1,1}
{0,1,1,1},
{0,0,1,1},
{1,0,1,1},
};
class TestApp:public VulkanApplicationFramework
@ -37,8 +40,8 @@ private:
SceneNode render_root;
RenderList * render_list =nullptr;
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
MaterialInstance * material_instance[6]={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
Renderable * render_obj[6] ={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
Pipeline * pipeline =nullptr;
@ -54,36 +57,42 @@ private:
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg);
material_instance=db->CreateMaterialInstance(mci);
/* for(uint i=0;i<6;i++)
{
material_instance[i]=db->CreateMaterialInstance(mci);
if(!material_instance[i])
return(false);
material_instance[i]->SetFloat4(0,color_data[i]);
}*/
}
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
// pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
//RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.SetVBO(VAN::Color, VF_V4F, color_data ))return(false);
//if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
//
//render_obj=rpc.Create(material_instance,pipeline);
render_obj=rpc.Create(material_instance,pipeline);
//if(!render_obj)
// return(false);
//
//for(uint i=0;i<6;i++)
//{
// render_root.CreateSubNode(rotate(deg2rad(60*i),Vector3f(0,0,1)),render_obj);
//}
if(!render_obj)
return(false);
//render_root.RefreshMatrix();
for(uint i=0;i<12;i++)
render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj);
render_root.RefreshMatrix();
render_list->Expend(&render_root);
//render_list->Expend(&render_root);
return(true);
}

View File

@ -9,7 +9,7 @@ namespace hgl
{
class DeviceBuffer;
class Texture;
class MaterialInstance;
class Material;
class DescriptorBinding
{
@ -92,7 +92,7 @@ namespace hgl
texture_map.DeleteByValue(tex);
}
bool Bind(MaterialInstance *);
bool Bind(Material *);
};//class DescriptorBinding
}//namespace graph
}//namespace hgl

View File

@ -4,13 +4,12 @@
#include<hgl/graph/VK.h>
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/type/Collection.h>
#include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKDescriptorSetType.h>
VK_NAMESPACE_BEGIN
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
using MaterialParameterArray=MaterialParameters *[DESCRIPTOR_SET_TYPE_COUNT];
struct MaterialData
{
UTF8String name;
@ -25,7 +24,9 @@ struct MaterialData
PipelineLayoutData *pipeline_layout_data;
MaterialParameterArray mp_array;
MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT];
uint32_t mi_data_bytes;
private:
@ -42,6 +43,8 @@ class Material
{
MaterialData *data;
Collection *mi_data;
private:
friend GPUDevice;

View File

@ -50,6 +50,8 @@ protected:
VIL *vil;
public:
Material * GetMaterial () {return material;}

View File

@ -75,8 +75,6 @@ public:
const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();}
const VertexInputData * GetVertexInputData ()const{return vertex_input;}
MaterialParameters *GetMP (const DescriptorSetType &type){return mat_inst->GetMP(type);}
};//class Renderable
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);

View File

@ -109,11 +109,12 @@ bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri)
uint32_t count=0;
MaterialParameters *mp;
Material *mtl=ri->GetMaterial();
VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT];
ENUM_CLASS_FOR(DescriptorSetType,int,i)
{
mp=ri->GetMP((DescriptorSetType)i);
mp=mtl->GetMP((DescriptorSetType)i);
if(mp)
{

View File

@ -3,12 +3,12 @@
#include<hgl/graph/VKMaterialInstance.h>
VK_NAMESPACE_BEGIN
bool DescriptorBinding::Bind(MaterialInstance *mi)
bool DescriptorBinding::Bind(Material *mtl)
{
if(!mi)
if(!mtl)
return(false);
MaterialParameters *mp=mi->GetMP(set_type);
MaterialParameters *mp=mtl->GetMP(set_type);
if(!mp)
return(false);

View File

@ -22,7 +22,7 @@ MaterialInstance::MaterialInstance(Material *mtl,VIL *v)
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
{
MaterialParameters *mp=GetMP(type);
MaterialParameters *mp=material->GetMP(type);
if(!mp)
return(false);
@ -35,7 +35,7 @@ bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &n
bool MaterialInstance::BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
{
MaterialParameters *mp=GetMP(type);
MaterialParameters *mp=material->GetMP(type);
if(!mp)
return(false);
@ -48,7 +48,7 @@ bool MaterialInstance::BindSSBO(const DescriptorSetType &type,const AnsiString &
bool MaterialInstance::BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler)
{
MaterialParameters *mp=GetMP(type);
MaterialParameters *mp=material->GetMP(type);
if(!mp)
return(false);

View File

@ -141,8 +141,10 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const
if(data_bytes>0)
mi_codes=glsl_codes;
const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange();
AnsiString MI_MAX_COUNT=AnsiString::numberOf(ubo_range/data_bytes);
const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); //小部分为16k大部分为64kIntel核显为128MAMD显卡无限制
const uint32_t mi_max_count=ubo_range/data_bytes;
const AnsiString MI_MAX_COUNT=AnsiString::numberOf(mi_max_count>256?256:mi_max_count); //我们使用uint8传递材质实例ID所以最大数量为256。未来如考虑使用更多需综合考虑
mdi.AddStruct(MaterialInstanceStruct,mi_codes);
mdi.AddStruct(SBS_MaterialInstanceData);