first tested ok that AutoMaterial in first_triangle example.

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-21 14:17:33 +08:00
parent 251bbd2705
commit 694add27ae
4 changed files with 102 additions and 21 deletions

View File

@ -8,9 +8,11 @@
#include<hgl/graph/SceneInfo.h> #include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h> #include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h> #include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/shadergen/MaterialCreateInfo.h>
using namespace hgl; using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
using namespace hgl::shadergen;
constexpr uint32_t SCREEN_WIDTH=1280; constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720; constexpr uint32_t SCREEN_HEIGHT=720;
@ -62,6 +64,10 @@ class TestApp:public VulkanApplicationFramework
{ {
private: private:
#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR)
VILConfig vil_config;
#endif
MaterialInstance * material_instance =nullptr; MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr; Renderable * render_obj =nullptr;
@ -69,11 +75,8 @@ private:
private: private:
bool InitMaterial() void InitVIL()
{ {
#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR)
VILConfig vil_config;
#ifdef USE_HALF_FLOAT_POSITION #ifdef USE_HALF_FLOAT_POSITION
vil_config.Add(VAN::Position,PositionFormat); vil_config.Add(VAN::Position,PositionFormat);
#endif//USE_HALF_FLOAT_POSITION #endif//USE_HALF_FLOAT_POSITION
@ -81,15 +84,66 @@ private:
#ifdef USE_UNORM8_COLOR #ifdef USE_UNORM8_COLOR
vil_config.Add(VAN::Color,ColorFormat); vil_config.Add(VAN::Color,ColorFormat);
#endif//USE_HALF_FLOAT_POSITION #endif//USE_HALF_FLOAT_POSITION
}
bool InitMaterial()
{
#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR)
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"),&vil_config); material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"),&vil_config);
#else #else
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC")); material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"));
#endif// #endif//
if(!material_instance) return material_instance;
}
bool InitAutoMaterial()
{
MaterialCreateInfo mc("VertexColor2D",1,false);
//vertex部分
{
ShaderCreateInfoVertex *vsc=mc.GetVS();
vsc->AddInput("vec2",VAN::Position);
vsc->AddInput("vec4",VAN::Color);
vsc->AddOutput("vec4","Color");
vsc->SetShaderCodes(R"(
void main()
{
Output.Color=Color;
gl_Position=vec4(Position,0,1);
})");
}
//fragment部分
{
ShaderCreateInfoFragment *fsc=mc.GetFS();
fsc->AddOutput("vec4","Color");
fsc->SetShaderCodes(R"(
void main()
{
Color=Input.Color;
})");
}
if(!mc.CreateShader())
return(false); return(false);
Material *m=db->CreateMaterial(&mc);
material_instance=db->CreateMaterialInstance(m,&vil_config);
return material_instance;
}
bool InitPipeline()
{
// 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
@ -118,7 +172,12 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
if(!InitMaterial()) InitVIL();
if(!InitAutoMaterial())
return(false);
if(!InitPipeline())
return(false); return(false);
if(!InitVBO()) if(!InitVBO())

View File

@ -33,6 +33,12 @@ using namespace hgl;
using namespace hgl::io; using namespace hgl::io;
using namespace hgl::graph; using namespace hgl::graph;
namespace glsl_compiler
{
bool Init();
void Close();
}//namespace glsl_compiler
class VulkanApplicationFramework:WindowEvent class VulkanApplicationFramework:WindowEvent
{ {
protected: protected:
@ -66,6 +72,8 @@ public:
virtual ~VulkanApplicationFramework() virtual ~VulkanApplicationFramework()
{ {
glsl_compiler::Close();
win->Unjoin(this); win->Unjoin(this);
SAFE_CLEAR(db); SAFE_CLEAR(db);
@ -78,6 +86,9 @@ public:
virtual bool Init(int w,int h) virtual bool Init(int w,int h)
{ {
if(!glsl_compiler::Init())
return(false);
clear_color.Set(0,0,0,1); clear_color.Set(0,0,0,1);
#ifdef _DEBUG #ifdef _DEBUG

View File

@ -42,9 +42,9 @@ public:
bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);} bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);}
// bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);} // bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);}
const ShaderCreateInfoVertex * GetVS()const{return vert;} ShaderCreateInfoVertex * GetVS()const{return vert;}
const ShaderCreateInfoGeometry * GetGS()const{return geom;} ShaderCreateInfoGeometry * GetGS()const{return geom;}
const ShaderCreateInfoFragment * GetFS()const{return frag;} ShaderCreateInfoFragment * GetFS()const{return frag;}
public: public:

View File

@ -204,6 +204,13 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf
if(!mci) if(!mci)
return(nullptr); return(nullptr);
Material *mtl;
const OSString mtl_name=ToOSString(mci->GetName());
if(material_by_name.Get(mtl_name,mtl))
return mtl;
SHADERGEN_NAMESPACE_USING SHADERGEN_NAMESPACE_USING
const uint count=GetShaderCountByBits(mci->GetShaderStage()); const uint count=GetShaderCountByBits(mci->GetShaderStage());
@ -212,8 +219,6 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf
ShaderModuleMap *smm=new ShaderModuleMap; ShaderModuleMap *smm=new ShaderModuleMap;
VertexInput *vertex_input=nullptr; VertexInput *vertex_input=nullptr;
const OSString mtl_name=ToOSString(mci->GetName());
const ShaderCreateInfoVertex *vert=mci->GetVS(); const ShaderCreateInfoVertex *vert=mci->GetVS();
if(vert) if(vert)
@ -222,13 +227,11 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf
VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_VERTEX_BIT,
vert->GetSPVData(),vert->GetSPVSize()); vert->GetSPVData(),vert->GetSPVSize());
if(sm) if(!sm)
{ return(false);
if(smm->Add(sm))
vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input);
}
smm->Add(sm); if(smm->Add(sm))
vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input);
} }
const ShaderCreateInfoGeometry *geom=mci->GetGS(); const ShaderCreateInfoGeometry *geom=mci->GetGS();
@ -253,9 +256,16 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf
smm->Add(sm); smm->Add(sm);
} }
MaterialDescriptorManager *mdm=new MaterialDescriptorManager(mci->GetName(),mci->GetMDI().Get()); MaterialDescriptorManager *mdm=nullptr;
Material *mtl=device->CreateMaterial(mci->GetName(),smm,mdm,vertex_input); {
const auto &mdi=mci->GetMDI();
if(mdi.GetCount()>0)
mdm=new MaterialDescriptorManager(mci->GetName(),mdi.Get());
}
mtl=device->CreateMaterial(mci->GetName(),smm,mdm,vertex_input);
if(!mtl) if(!mtl)
{ {
@ -263,6 +273,7 @@ Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInf
delete smm; delete smm;
} }
material_by_name.Add(mtl_name,mtl);
return mtl; return mtl;
} }
VK_NAMESPACE_END VK_NAMESPACE_END