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
|
||||
};
|
||||
|
||||
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)
|
||||
if(!material_instance[i])
|
||||
return(false);
|
||||
|
||||
material_instance[i]->SetFloat4(0,color_data[i]);
|
||||
}*/
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -50,6 +50,8 @@ protected:
|
||||
|
||||
VIL *vil;
|
||||
|
||||
|
||||
|
||||
public:
|
||||
|
||||
Material * GetMaterial () {return material;}
|
||||
|
@ -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 *);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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,大部分为64k,Intel核显为128M,AMD显卡无限制
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user