first tested ok that AutoMaterial in first_triangle example.
This commit is contained in:
parent
251bbd2705
commit
694add27ae
@ -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())
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user