Compare commits
4 Commits
f762d77b1d
...
a04adb897e
Author | SHA1 | Date | |
---|---|---|---|
a04adb897e | |||
8436e57ed7 | |||
bc987e7d7b | |||
427340132f |
@ -1 +1 @@
|
||||
Subproject commit 737fe5c80d013f807cbb8f4d333d5a59c82571bc
|
||||
Subproject commit 6fbc7078181cefc7e5da590c2d4ccc70507934b7
|
@ -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 **)
|
||||
|
@ -102,7 +102,7 @@ protected:
|
||||
bool BindVAB(const MeshDataBuffer *,const uint);
|
||||
|
||||
void ProcIndirectRender();
|
||||
void Render(RenderItem *);
|
||||
bool Render(RenderItem *);
|
||||
|
||||
public:
|
||||
|
||||
|
@ -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; ///<是否是空的,不可渲染或是没啥可渲染的
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user