few about MaterialInstance
This commit is contained in:
parent
9d3ea89861
commit
ffaa6b5362
@ -23,11 +23,14 @@ constexpr float position_data[VERTEX_COUNT*2]=
|
|||||||
0.1, 0.9
|
0.1, 0.9
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr float color_data[3][4]=
|
constexpr float color_data[6][4]=
|
||||||
{
|
{
|
||||||
{1,0,0,1},
|
{1,0,0,1},
|
||||||
|
{1,1,0,1},
|
||||||
{0,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
|
class TestApp:public VulkanApplicationFramework
|
||||||
@ -37,8 +40,8 @@ private:
|
|||||||
SceneNode render_root;
|
SceneNode render_root;
|
||||||
RenderList * render_list =nullptr;
|
RenderList * render_list =nullptr;
|
||||||
|
|
||||||
MaterialInstance * material_instance =nullptr;
|
MaterialInstance * material_instance[6]={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
|
||||||
Renderable * render_obj =nullptr;
|
Renderable * render_obj[6] ={nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
|
||||||
|
|
||||||
Pipeline * pipeline =nullptr;
|
Pipeline * pipeline =nullptr;
|
||||||
|
|
||||||
@ -54,36 +57,42 @@ private:
|
|||||||
|
|
||||||
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg);
|
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)
|
if(!material_instance[i])
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
material_instance[i]->SetFloat4(0,color_data[i]);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
|
// 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;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InitVBO()
|
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::Position, VF_V2F, position_data))return(false);
|
||||||
if(!rpc.SetVBO(VAN::Color, VF_V4F, color_data ))return(false);
|
//
|
||||||
|
//render_obj=rpc.Create(material_instance,pipeline);
|
||||||
render_obj=rpc.Create(material_instance,pipeline);
|
|
||||||
|
|
||||||
if(!render_obj)
|
//if(!render_obj)
|
||||||
return(false);
|
// return(false);
|
||||||
|
//
|
||||||
for(uint i=0;i<12;i++)
|
//for(uint i=0;i<6;i++)
|
||||||
render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj);
|
//{
|
||||||
|
// render_root.CreateSubNode(rotate(deg2rad(60*i),Vector3f(0,0,1)),render_obj);
|
||||||
|
//}
|
||||||
|
|
||||||
render_root.RefreshMatrix();
|
//render_root.RefreshMatrix();
|
||||||
|
|
||||||
render_list->Expend(&render_root);
|
//render_list->Expend(&render_root);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
class DeviceBuffer;
|
class DeviceBuffer;
|
||||||
class Texture;
|
class Texture;
|
||||||
class MaterialInstance;
|
class Material;
|
||||||
|
|
||||||
class DescriptorBinding
|
class DescriptorBinding
|
||||||
{
|
{
|
||||||
@ -92,7 +92,7 @@ namespace hgl
|
|||||||
texture_map.DeleteByValue(tex);
|
texture_map.DeleteByValue(tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Bind(MaterialInstance *);
|
bool Bind(Material *);
|
||||||
};//class DescriptorBinding
|
};//class DescriptorBinding
|
||||||
}//namespace graph
|
}//namespace graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
@ -4,13 +4,12 @@
|
|||||||
#include<hgl/graph/VK.h>
|
#include<hgl/graph/VK.h>
|
||||||
#include<hgl/type/Map.h>
|
#include<hgl/type/Map.h>
|
||||||
#include<hgl/type/String.h>
|
#include<hgl/type/String.h>
|
||||||
|
#include<hgl/type/Collection.h>
|
||||||
#include<hgl/graph/VKShaderModuleMap.h>
|
#include<hgl/graph/VKShaderModuleMap.h>
|
||||||
#include<hgl/graph/VKDescriptorSetType.h>
|
#include<hgl/graph/VKDescriptorSetType.h>
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
|
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
|
||||||
|
|
||||||
using MaterialParameterArray=MaterialParameters *[DESCRIPTOR_SET_TYPE_COUNT];
|
|
||||||
|
|
||||||
struct MaterialData
|
struct MaterialData
|
||||||
{
|
{
|
||||||
UTF8String name;
|
UTF8String name;
|
||||||
@ -25,7 +24,9 @@ struct MaterialData
|
|||||||
|
|
||||||
PipelineLayoutData *pipeline_layout_data;
|
PipelineLayoutData *pipeline_layout_data;
|
||||||
|
|
||||||
MaterialParameterArray mp_array;
|
MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT];
|
||||||
|
|
||||||
|
uint32_t mi_data_bytes;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -42,6 +43,8 @@ class Material
|
|||||||
{
|
{
|
||||||
MaterialData *data;
|
MaterialData *data;
|
||||||
|
|
||||||
|
Collection *mi_data;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
friend GPUDevice;
|
friend GPUDevice;
|
||||||
|
@ -50,6 +50,8 @@ protected:
|
|||||||
|
|
||||||
VIL *vil;
|
VIL *vil;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Material * GetMaterial () {return material;}
|
Material * GetMaterial () {return material;}
|
||||||
|
@ -75,8 +75,6 @@ public:
|
|||||||
const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();}
|
const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();}
|
||||||
|
|
||||||
const VertexInputData * GetVertexInputData ()const{return vertex_input;}
|
const VertexInputData * GetVertexInputData ()const{return vertex_input;}
|
||||||
|
|
||||||
MaterialParameters *GetMP (const DescriptorSetType &type){return mat_inst->GetMP(type);}
|
|
||||||
};//class Renderable
|
};//class Renderable
|
||||||
|
|
||||||
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
|
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
|
||||||
|
@ -109,11 +109,12 @@ bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri)
|
|||||||
uint32_t count=0;
|
uint32_t count=0;
|
||||||
|
|
||||||
MaterialParameters *mp;
|
MaterialParameters *mp;
|
||||||
|
Material *mtl=ri->GetMaterial();
|
||||||
VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT];
|
VkDescriptorSet ds[DESCRIPTOR_SET_TYPE_COUNT];
|
||||||
|
|
||||||
ENUM_CLASS_FOR(DescriptorSetType,int,i)
|
ENUM_CLASS_FOR(DescriptorSetType,int,i)
|
||||||
{
|
{
|
||||||
mp=ri->GetMP((DescriptorSetType)i);
|
mp=mtl->GetMP((DescriptorSetType)i);
|
||||||
|
|
||||||
if(mp)
|
if(mp)
|
||||||
{
|
{
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
#include<hgl/graph/VKMaterialInstance.h>
|
#include<hgl/graph/VKMaterialInstance.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
bool DescriptorBinding::Bind(MaterialInstance *mi)
|
bool DescriptorBinding::Bind(Material *mtl)
|
||||||
{
|
{
|
||||||
if(!mi)
|
if(!mtl)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
MaterialParameters *mp=mi->GetMP(set_type);
|
MaterialParameters *mp=mtl->GetMP(set_type);
|
||||||
|
|
||||||
if(!mp)
|
if(!mp)
|
||||||
return(false);
|
return(false);
|
||||||
|
@ -22,7 +22,7 @@ MaterialInstance::MaterialInstance(Material *mtl,VIL *v)
|
|||||||
|
|
||||||
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
|
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
|
||||||
{
|
{
|
||||||
MaterialParameters *mp=GetMP(type);
|
MaterialParameters *mp=material->GetMP(type);
|
||||||
|
|
||||||
if(!mp)
|
if(!mp)
|
||||||
return(false);
|
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)
|
bool MaterialInstance::BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
|
||||||
{
|
{
|
||||||
MaterialParameters *mp=GetMP(type);
|
MaterialParameters *mp=material->GetMP(type);
|
||||||
|
|
||||||
if(!mp)
|
if(!mp)
|
||||||
return(false);
|
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)
|
bool MaterialInstance::BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler)
|
||||||
{
|
{
|
||||||
MaterialParameters *mp=GetMP(type);
|
MaterialParameters *mp=material->GetMP(type);
|
||||||
|
|
||||||
if(!mp)
|
if(!mp)
|
||||||
return(false);
|
return(false);
|
||||||
|
@ -141,8 +141,10 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const
|
|||||||
if(data_bytes>0)
|
if(data_bytes>0)
|
||||||
mi_codes=glsl_codes;
|
mi_codes=glsl_codes;
|
||||||
|
|
||||||
const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange();
|
const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); //小部分为16k,大部分为64k,Intel核显为128M,AMD显卡无限制
|
||||||
AnsiString MI_MAX_COUNT=AnsiString::numberOf(ubo_range/data_bytes);
|
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(MaterialInstanceStruct,mi_codes);
|
||||||
mdi.AddStruct(SBS_MaterialInstanceData);
|
mdi.AddStruct(SBS_MaterialInstanceData);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user