fixed a bug that MaterialParameters didn't support dynamic UBO/SSBO.

This commit is contained in:
2021-09-15 19:17:56 +08:00
parent d82534b168
commit 72351af025
14 changed files with 175 additions and 123 deletions

View File

@@ -24,14 +24,14 @@ macro(CreateQtProject name)
endmacro()
CreateProject(00.triangle first_triangle.cpp)
CreateProject(00.two_triangle two_triangle.cpp)
CreateProject(01.FragCoord FragCoordTest.cpp)
CreateProject(02.indices_rect indices_rect.cpp)
CreateProject(03.TextureFormat TextureFormat.cpp)
CreateProject(04.texture_rect texture_rect.cpp)
CreateProject(05.HQFilterTexture HQFilterTexture.cpp)
CreateProject(06.Geometry2D Geometry2D.cpp)
CreateProject(07.Geometry3D Geometry3D.cpp)
CreateProject(01.two_triangle two_triangle.cpp)
CreateProject(02.FragCoord FragCoordTest.cpp)
CreateProject(03.indices_rect indices_rect.cpp)
CreateProject(04.TextureFormat TextureFormat.cpp)
CreateProject(05.texture_rect texture_rect.cpp)
#CreateProject(05.HQFilterTexture HQFilterTexture.cpp)
#CreateProject(06.Geometry2D Geometry2D.cpp)
CreateProject(06.Geometry3D Geometry3D.cpp)
#CreateProject(08.SceneTree SceneTree.cpp)
#CreateProject(09.LoadStaticMesh LoadStaticMesh.cpp LoadScene.cpp)
CreateProject(10.InlineGeometryScene InlineGeometryScene.cpp)

View File

@@ -34,19 +34,21 @@ private:
private:
bool RecreatePipeline()
{
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::TriangleStrip);
return pipeline;
}
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/FragColor"));
if(!material_instance)
return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::TriangleStrip);
if(!pipeline)
return(false);
return(true);
return RecreatePipeline();
}
bool InitUBO()
@@ -116,6 +118,9 @@ public:
cam.Refresh();
ubo_camera_info->Write(&cam.info);
RecreatePipeline();
renderable_instance->UpdatePipeline(pipeline);
BuildCommandBuffer(renderable_instance);
}

View File

@@ -42,6 +42,13 @@ private:
private:
bool RecreatePipeline()
{
pipeline=CreatePipeline(material,InlinePipeline::Solid2D,Prim::Fan);
return pipeline;
}
bool InitMaterial()
{
material=db->CreateMaterial(OS_TEXT("res/material/PureColor2D"));
@@ -52,9 +59,7 @@ private:
if(!material_instance)return(false);
pipeline=CreatePipeline(material,InlinePipeline::Solid2D,Prim::Fan);
return pipeline;
return RecreatePipeline();
}
void CreateRenderObject()
@@ -166,6 +171,9 @@ public:
ubo_camera_info->Write(&cam.info);
RecreatePipeline();
renderable_instance->UpdatePipeline(pipeline);
BuildCommandBuffer(&render_list);
}
};//class TestApp:public VulkanApplicationFramework

View File

@@ -24,30 +24,35 @@ private:
SceneNode render_root;
RenderList *render_list=nullptr;
struct MDP
{
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Pipeline * pipeline =nullptr;
}m3d;//,m2d;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Pipeline * pipeline =nullptr;
Renderable *ro_plane_grid[3],
*ro_round_rectangle =nullptr;
Renderable * ro_plane_grid[3];
RenderableInstance *ri_plane_grid[3];
private:
bool InitMDP(MDP *mdp,const Prim primitive,const OSString &mtl_name)
bool RecreatePipeline()
{
mdp->material=db->CreateMaterial(mtl_name);
if(!mdp->material)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid3D,Prim::Lines);
mdp->material_instance=db->CreateMaterialInstance(mdp->material);
if(!mdp->material_instance)return(false);
return pipeline;
}
mdp->pipeline=CreatePipeline(mdp->material_instance,InlinePipeline::Solid3D,primitive);
bool InitMDP()
{
material=db->CreateMaterial(OS_TEXT("res/material/VertexColor3D"));
if(!material)return(false);
material_instance=db->CreateMaterialInstance(material);
if(!material_instance)return(false);
if(!RecreatePipeline())
return(false);
{
MaterialParameters *mp_global=mdp->material_instance->GetMP(DescriptorSetType::Global);
MaterialParameters *mp_global=material_instance->GetMP(DescriptorSetType::Global);
if(!mp_global)
return(false);
@@ -60,18 +65,13 @@ private:
return(true);
}
void Add(Renderable *r,MDP &mdp)
RenderableInstance *Add(Renderable *r,const Matrix4f &mat)
{
auto ri=db->CreateRenderableInstance(r,mdp.material_instance,mdp.pipeline);
render_root.CreateSubNode(ri);
}
void Add(Renderable *r,MDP &mdp,const Matrix4f &mat)
{
auto ri=db->CreateRenderableInstance(r,mdp.material_instance,mdp.pipeline);
RenderableInstance *ri=db->CreateRenderableInstance(r,material_instance,pipeline);
render_root.CreateSubNode(mat,ri);
return ri;
}
void CreateRenderObject()
@@ -92,36 +92,25 @@ private:
pgci.color.Set(0.5,0,0,1);
pgci.side_color.Set(1,0,0,1);
ro_plane_grid[0]=CreateRenderablePlaneGrid(db,m3d.material,&pgci);
ro_plane_grid[0]=CreateRenderablePlaneGrid(db,material,&pgci);
pgci.color.Set(0,0.5,0,1);
pgci.side_color.Set(0,1,0,1);
ro_plane_grid[1]=CreateRenderablePlaneGrid(db,m3d.material,&pgci);
ro_plane_grid[1]=CreateRenderablePlaneGrid(db,material,&pgci);
pgci.color.Set(0,0,0.5,1);
pgci.side_color.Set(0,0,1,1);
ro_plane_grid[2]=CreateRenderablePlaneGrid(db,m3d.material,&pgci);
//{
// struct RoundRectangleCreateInfo rrci;
// rrci.scope.Set(SCREEN_WIDTH-30,10,20,20);
// rrci.radius=5;
// rrci.round_per=5;
// ro_round_rectangle=CreateRenderableRoundRectangle(db,m2d.material,&rrci);
//}
ro_plane_grid[2]=CreateRenderablePlaneGrid(db,material,&pgci);
camera->pos.Set(200,200,200,1.0);
}
bool InitScene()
{
// Add(ro_round_rectangle,m2d);
Add(ro_plane_grid[0],m3d);
Add(ro_plane_grid[1],m3d,rotate(HGL_RAD_90,0,1,0));
Add(ro_plane_grid[2],m3d,rotate(HGL_RAD_90,1,0,0));
ri_plane_grid[0]=Add(ro_plane_grid[0],Matrix4f::identity);
ri_plane_grid[1]=Add(ro_plane_grid[1],rotate(HGL_RAD_90,0,1,0));
ri_plane_grid[2]=Add(ro_plane_grid[2],rotate(HGL_RAD_90,1,0,0));
render_root.RefreshMatrix();
render_list->Expend(camera->info,&render_root);
@@ -143,22 +132,9 @@ public:
render_list=new RenderList(device);
if(!InitMDP(&m3d,Prim::Lines,OS_TEXT("res/material/VertexColor3D")))
if(!InitMDP())
return(false);
//if(!InitMDP(&m2d,Prim::Fan, OS_TEXT("res/material/PureColor2D")))
// return(false);
//{
// color.Set(1,1,0,1);
// ubo_color=device->CreateUBO(sizeof(Vector4f),&color);
// m2d.material_instance->BindUBO("color_material",ubo_color);
// m2d.material_instance->Update();
// db->Add(ubo_color);
//}
CreateRenderObject();
if(!InitScene())
@@ -171,6 +147,18 @@ public:
{
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
void Resize(int w,int h)override
{
CameraAppFramework::Resize(w,h);
RecreatePipeline();
for(int i=0;i<3;i++)
ri_plane_grid[i]->UpdatePipeline(pipeline);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)

View File

@@ -37,7 +37,7 @@ constexpr uint16 index_data[INDEX_COUNT]=
0,3,2
};
class TestApp:public VulkanApplicationFramework
class TestApp:public CameraAppFramework
{
private:
@@ -65,30 +65,26 @@ private:
IndexBuffer * index_buffer =nullptr;
SceneNode render_root;
RenderList render_list;
RenderList *render_list =nullptr;
public:
~TestApp()
{
SAFE_CLEAR(index_buffer);
SAFE_CLEAR(tex_coord_buffer);
SAFE_CLEAR(vertex_buffer);
SAFE_CLEAR(sampler_nearest);
SAFE_CLEAR(sampler_linear);
SAFE_CLEAR(render_list);
}
private:
bool InitVBO()
{
vertex_buffer =device->CreateVAB(VF_VEC2,VERTEX_COUNT,vertex_data);
vertex_buffer =db->CreateVAB(VF_VEC2,VERTEX_COUNT,vertex_data);
if(!vertex_buffer)return(false);
tex_coord_buffer=device->CreateVAB(VF_VEC2,VERTEX_COUNT,tex_coord_data);
tex_coord_buffer=db->CreateVAB(VF_VEC2,VERTEX_COUNT,tex_coord_data);
if(!tex_coord_buffer)return(false);
index_buffer =device->CreateIBO16(INDEX_COUNT,index_data);
index_buffer =db->CreateIBO16(INDEX_COUNT,index_data);
if(!index_buffer)return(false);
return(true);
@@ -103,6 +99,8 @@ private:
render_obj->Set(VAN::TexCoord,tex_coord_buffer);
render_obj->Set(index_buffer);
render_list=new RenderList(device);
return(true);
}
@@ -126,7 +124,7 @@ private:
sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
sampler_create_info.unnormalizedCoordinates = false;
return device->CreateSampler(&sampler_create_info);
return db->CreateSampler(&sampler_create_info);
}
bool InitTexture()
@@ -151,8 +149,8 @@ private:
pipeline_data=GetPipelineData(InlinePipeline::Solid2D);
if(!pipeline_data)return(false);
if(!InitMaterial(&mp_normal,OS_TEXT("res/material/Texture2DPC")))return(false);
if(!InitMaterial(&mp_hq, OS_TEXT("res/material/Texture2DHQPC")))return(false);
if(!InitMaterial(&mp_normal,OS_TEXT("res/material/Texture2D")))return(false);
if(!InitMaterial(&mp_hq, OS_TEXT("res/material/Texture2DHQ")))return(false);
return(true);
}
@@ -162,6 +160,17 @@ private:
mir->material_instance=db->CreateMaterialInstance(mp->material);
if(!mir->material_instance)return(false);
{
MaterialParameters *mp_global=mir->material_instance->GetMP(DescriptorSetType::Global);
if(!mp_global)
return(false);
if(!mp_global->BindUBO("g_camera",GetCameraInfoBuffer()))return(false);
mp_global->Update();
}
{
MaterialParameters *mp_texture=mir->material_instance->GetMP(DescriptorSetType::Value);
@@ -195,9 +204,6 @@ private:
Add(&mir_nearest_hq,translate(-1, 0,0));
Add(&mir_linear_hq, translate( 0, 0,0));
render_root.RefreshMatrix();
render_list.Expend(&render_root);
BuildCommandBuffer(&render_list);
return(true);
}
@@ -205,7 +211,7 @@ public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_SIZE,SCREEN_SIZE))
if(!CameraAppFramework::Init(SCREEN_SIZE,SCREEN_SIZE))
return(false);
if(!InitVBO())
@@ -236,7 +242,15 @@ public:
void Resize(int w,int h) override
{
BuildCommandBuffer(&render_list);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
void BuildCommandBuffer(uint32_t index) override
{
render_root.RefreshMatrix();
render_list->Expend(camera->info,&render_root);
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
};//class TestApp:public VulkanApplicationFramework

View File

@@ -44,13 +44,20 @@ private:
private:
bool RecreatePipeline()
{
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/FragColor"));
if(!material_instance)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D);
return(true);
return RecreatePipeline();
}
bool InitUBO()
@@ -122,6 +129,9 @@ public:
cam.Refresh();
ubo_camera_info->Write(&cam.info);
RecreatePipeline();
renderable_instance->UpdatePipeline(pipeline);
BuildCommandBuffer(renderable_instance);
}

View File

@@ -58,13 +58,21 @@ private:
private:
bool RecreatePipeline()
{
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D"));
if(!material_instance)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D);
if(!pipeline)return(false);
if(!RecreatePipeline())
return(false);
texture=db->LoadTexture2D(OS_TEXT("res/image/lena.Tex2D"));
if(!texture)return(false);
@@ -157,6 +165,9 @@ public:
ubo_camera_info->Write(&cam.info);
RecreatePipeline();
renderable_instance->UpdatePipeline(pipeline);
BuildCommandBuffer(renderable_instance);
}
};//class TestApp:public VulkanApplicationFramework

View File

@@ -43,6 +43,14 @@ private:
private:
bool RecreatePipeline()
{
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
@@ -50,10 +58,7 @@ private:
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
return RecreatePipeline();
}
bool InitUBO()
@@ -137,6 +142,9 @@ public:
cam.Refresh();
ubo_camera_info->Write(&cam.info);
RecreatePipeline();
render_instance->UpdatePipeline(pipeline);
BuildCommandBuffer(render_list);
}