Compare commits

...

4 Commits

10 changed files with 54 additions and 49 deletions

@ -1 +1 @@
Subproject commit 737fe5c80d013f807cbb8f4d333d5a59c82571bc
Subproject commit 6fbc7078181cefc7e5da590c2d4ccc70507934b7

View File

@ -35,8 +35,6 @@ class TestApp:public WorkObject
{
private:
Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f);
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
@ -48,7 +46,7 @@ private:
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,
CoordinateSystem2D::Ortho,
mtl::WithLocalToWorld::Without);
mtl::WithLocalToWorld::With);
VILConfig vil_config;
@ -73,7 +71,7 @@ private:
bool InitVBO()
{
const auto ext=GetExtent2D();
const auto ext=GetExtent();
for(uint i=0;i<VERTEX_COUNT;i++)
{
@ -86,6 +84,11 @@ private:
{VAN::Position,POSITION_DATA_FORMAT,position_data},
{VAN::Color, COLOR_DATA_FORMAT, color_data}
});
SceneNode *scene_root=GetSceneRoot(); ///<取得场景根节点
scene_root->Add(new SceneNode(render_obj));
return(render_obj);
}
@ -103,15 +106,6 @@ public:
return(true);
}
void Render(double delta_time,graph::RenderCmdBuffer *cmd)override
{
cmd->SetClearColor(0,clear_color);
cmd->BeginRenderPass();
cmd->Render(render_obj);
cmd->EndRenderPass();
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)

View File

@ -102,7 +102,7 @@ protected:
bool BindVAB(const MeshDataBuffer *,const uint);
void ProcIndirectRender();
void Render(RenderItem *);
bool Render(RenderItem *);
public:

View File

@ -41,8 +41,6 @@ namespace hgl::graph
bool Set(IRenderTarget *rt);
void Set(Camera *c){camera=c;}
void Restart(); ///<复位数据,清空渲染列表
bool RebuildRenderList(SceneNode *);
bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的

View File

@ -54,7 +54,7 @@ class RenderResource
IDObjectManage<PrimitiveID, Primitive> rm_primitives; ///<图元合集
IDObjectManage<BufferID, DeviceBuffer> rm_buffers; ///<顶点缓冲区合集
IDObjectManage<SamplerID, Sampler> rm_samplers; ///<采样器合集
IDObjectManage<RenderableID, Mesh> rm_renderables; ///<渲染实例集合集
IDObjectManage<RenderableID, Mesh> rm_renderables; ///<渲染实例集合集
private:
@ -77,16 +77,9 @@ public:
VulkanDevice *GetDevice(){return device;}
//注:并非一定要走这里,这里只是提供一个注册和自动绑定的机制
DescriptorBinding static_descriptor; ///<静态属性描述符绑定管理
DescriptorBinding global_descriptor; ///<全局属性描述符绑定管理
public:
RenderResource(VulkanDevice *dev):device(dev),
static_descriptor(DescriptorSetType::Static),
global_descriptor(DescriptorSetType::Global)
{}
RenderResource(VulkanDevice *dev):device(dev){}
virtual ~RenderResource()=default;
public: //添加数据到管理器如果指针为nullptr会返回-1
@ -97,7 +90,7 @@ public: //添加数据到管理器如果指针为nullptr会返回-1
PrimitiveID Add(Primitive * p ){return rm_primitives.Add(p);}
BufferID Add(DeviceBuffer * buf ){return rm_buffers.Add(buf);}
SamplerID Add(Sampler * s ){return rm_samplers.Add(s);}
RenderableID Add(Mesh * r ){return rm_renderables.Add(r);}
RenderableID Add(Mesh * r ){return rm_renderables.Add(r);}
public: // VAB/VAO

View File

@ -29,7 +29,7 @@ class IRenderTarget
public:
RenderFramework * GetRenderFramework ()const{return render_framework;}
VulkanDevice * GetDevice ()const;
VulkanDevice * GetDevice ()const;
VkDevice GetVkDevice ()const;
DescriptorBinding * GetDescriptorBinding(){return &desc_binding;}

View File

@ -38,16 +38,31 @@ public:
return write_count>=vab_count;
}
void Add(const VkBuffer buf,const VkDeviceSize offset)
bool Add(const VkBuffer buf,const VkDeviceSize offset)
{
if(IsFull())
{
//如果在这里出现错误一般是材质的VertexInput与实现要使用的不匹配。很多时候是由于引擎自动添加的VertexInput但材质里没有。
//比较典型的情况是创建材质时设置了不需要L2W,但实际又进行了传递
return(false); //列表已满
}
vab_list[write_count]=buf;
vab_offset[write_count]=offset;
++write_count;
return(true);
}
void Add(const VkBuffer *buf,const VkDeviceSize *offset,const uint32_t count)
bool Add(const VkBuffer *buf,const VkDeviceSize *offset,const uint32_t count)
{
if(!buf||!offset||!count)
return(false);
if(write_count+count>vab_count)
return(false); //列表已满
hgl_cpy(vab_list +write_count,buf, count);
if(offset)
@ -56,6 +71,7 @@ public:
hgl_set<VkDeviceSize>(vab_offset+write_count,VkDeviceSize(0),count);
write_count+=count;
return(true);
}
};//class VABList
VK_NAMESPACE_END

View File

@ -172,9 +172,6 @@ Material *RenderResource::CreateMaterial(const AnsiString &mtl_name,const mtl::M
Add(mtl);
static_descriptor.Bind(mtl);
global_descriptor.Bind(mtl);
material_by_name.Add(mtl_name,mtl);
return mtl.Finish();
}

View File

@ -346,13 +346,21 @@ bool MaterialRenderList::BindVAB(const MeshDataBuffer *pdb,const uint ri_index)
//Basic组它所有的VAB信息均来自于Primitive由vid参数传递进来
{
vab_list->Add(pdb->vab_list,
pdb->vab_offset,
pdb->vab_count);
if(!vab_list->Add(pdb->vab_list,pdb->vab_offset,pdb->vab_count))
{
//这个情况很严重哦!
return(false);
}
}
if(assign_buffer) //L2W/MI分发组
vab_list->Add(assign_buffer->GetVAB(),0);//ASSIGN_VAB_STRIDE_BYTES*ri_index);
if (assign_buffer) //L2W/MI分发组
{
if(!vab_list->Add(assign_buffer->GetVAB(),0))//ASSIGN_VAB_STRIDE_BYTES*ri_index);
{
//一般出现这个情况是因为材质中没有配置需要L2W
return(false);
}
}
//if(!vab_list.IsFull()) //Joint组暂未支持
//{
@ -405,7 +413,7 @@ void MaterialRenderList::ProcIndirectRender()
indirect_draw_count=0;
}
void MaterialRenderList::Render(RenderItem *ri)
bool MaterialRenderList::Render(RenderItem *ri)
{
if(!last_data_buffer||*(ri->pdb)!=*last_data_buffer) //换buf了
{
@ -415,7 +423,11 @@ void MaterialRenderList::Render(RenderItem *ri)
last_data_buffer=ri->pdb;
last_render_data=nullptr;
BindVAB(ri->pdb,ri->first_instance);
if(!BindVAB(ri->pdb,ri->first_instance))
{
//这个问题很严重哦
return(false);
}
if(ri->pdb->ibo)
cmd_buf->BindIBO(ri->pdb->ibo);
@ -432,6 +444,8 @@ void MaterialRenderList::Render(RenderItem *ri)
{
cmd_buf->Draw(ri->pdb,ri->prd,ri->instance_count,ri->first_instance);
}
return(true);
}
void MaterialRenderList::Render(RenderCmdBuffer *rcb)

View File

@ -42,14 +42,6 @@ namespace hgl::graph
return(true);
}
void RenderTask::Restart()
{
if(!render_list)
return;
render_list->Clear();
}
bool RenderTask::RebuildRenderList(SceneNode *root)
{
if(!root)
@ -58,7 +50,8 @@ namespace hgl::graph
if(!render_list)
return(false);
render_list->Clear();
//记往不需要也千万不要手动render_list->Clear因为那会完全释放掉所有数据
//render_list->Expend会自己复位所有数据但并不释放内存
render_list->Expend(root);
return(true);