From 4e144072e4735cf7530f4d668a406e03efec4135 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Thu, 21 Sep 2023 22:11:20 +0800 Subject: [PATCH] texture_rect run ok! --- example/Vulkan/texture_rect.cpp | 6 +++-- inc/hgl/graph/VKDeviceCreater.h | 2 ++ inc/hgl/graph/mtl/2d/Material2DCreateConfig.h | 2 +- inc/hgl/shadergen/ShaderCreateInfo.h | 3 ++- inc/hgl/shadergen/ShaderCreateInfoGeometry.h | 2 ++ src/ShaderGen/2d/M_RectTexture2D.cpp | 25 +++++++++++-------- src/ShaderGen/ShaderCreateInfo.cpp | 13 +++++++--- src/ShaderGen/ShaderCreateInfoGeometry.cpp | 10 +++++++- src/ShaderGen/common/MFRectPrimitive.h | 19 +++----------- 9 files changed, 48 insertions(+), 34 deletions(-) diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 46e2fa57..0a17318b 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -21,8 +21,10 @@ constexpr uint32_t SCREEN_HEIGHT=256; constexpr float position_data[4]= { - -1,-1, - 2,2 + -1, //left + -1, //top + 1, //right + 1 //bottom; }; constexpr float tex_coord_data[4]= diff --git a/inc/hgl/graph/VKDeviceCreater.h b/inc/hgl/graph/VKDeviceCreater.h index 134dcd68..0a925d5c 100644 --- a/inc/hgl/graph/VKDeviceCreater.h +++ b/inc/hgl/graph/VKDeviceCreater.h @@ -92,6 +92,8 @@ public: hgl_zero(*this); descriptor_pool=1024; + + geometry_shader=true; } }; diff --git a/inc/hgl/graph/mtl/2d/Material2DCreateConfig.h b/inc/hgl/graph/mtl/2d/Material2DCreateConfig.h index 88e8dac3..8f9c5e3c 100644 --- a/inc/hgl/graph/mtl/2d/Material2DCreateConfig.h +++ b/inc/hgl/graph/mtl/2d/Material2DCreateConfig.h @@ -32,6 +32,6 @@ namespace SamplerName MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *); MaterialCreateInfo *CreatePureColor2D(const Material2DCreateConfig *); MaterialCreateInfo *CreatePureTexture2D(const Material2DCreateConfig *); -MaterialCreateInfo *CreateRectTexture2D(const Material2DCreateConfig *); +MaterialCreateInfo *CreateRectTexture2D(Material2DCreateConfig *); STD_MTL_NAMESPACE_END #endif//HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index 3103fa38..11c2ea9f 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -46,6 +46,7 @@ protected: virtual bool ProcHeader(){return(true);} virtual bool ProcDefine(); + virtual bool ProcLayout(){return(true);} virtual bool ProcSubpassInput(); virtual bool ProcInput(ShaderCreateInfo *); @@ -57,7 +58,7 @@ protected: virtual bool ProcUBO(); virtual bool ProcSSBO(); - virtual bool ProcConst(); + virtual bool ProcConstantID(); virtual bool ProcSampler(); bool CompileToSPV(); diff --git a/inc/hgl/shadergen/ShaderCreateInfoGeometry.h b/inc/hgl/shadergen/ShaderCreateInfoGeometry.h index 075fbede..00c81a88 100644 --- a/inc/hgl/shadergen/ShaderCreateInfoGeometry.h +++ b/inc/hgl/shadergen/ShaderCreateInfoGeometry.h @@ -15,5 +15,7 @@ public: ~ShaderCreateInfoGeometry()=default; bool SetGeom(const Prim &ip,const Prim &op,const uint32_t mv); + + bool ProcLayout() override; }; }}//namespace hgl::graph \ No newline at end of file diff --git a/src/ShaderGen/2d/M_RectTexture2D.cpp b/src/ShaderGen/2d/M_RectTexture2D.cpp index 02a7023b..b6cb7d12 100644 --- a/src/ShaderGen/2d/M_RectTexture2D.cpp +++ b/src/ShaderGen/2d/M_RectTexture2D.cpp @@ -12,7 +12,7 @@ void main() { Output.TexCoord=TexCoord; - gl_Position=RectVertexPosition(GetPosition2D()); + gl_Position=GetPosition2D(); })"; //一个shader中输出的所有数据,会被定义在一个名为Output的结构中。所以编写时要用Output.XXXX来使用。 @@ -23,8 +23,8 @@ void main() { vec2 vlt=gl_in[0].gl_Position.xy; vec2 vrb=gl_in[0].gl_Position.zw; - vec2 tlt=Input.TexCoord[0].xy; - vec2 trb=Input.TexCoord[0].zw; + vec2 tlt=Input[0].TexCoord.xy; + vec2 trb=Input[0].TexCoord.zw; gl_Position=vec4(vlt, vec2(0,1));Output.TexCoord=tlt; EmitVertex(); gl_Position=vec4(vlt.x, vrb.y, vec2(0,1));Output.TexCoord=vec2(tlt.x,trb.y); EmitVertex(); @@ -40,12 +40,12 @@ void main() Color=texture(TextureColor,Input.TexCoord); })"; - class MaterialPureTexture2D:public Std2DMaterial + class MaterialRectTexture2D:public Std2DMaterial { public: using Std2DMaterial::Std2DMaterial; - ~MaterialPureTexture2D()=default; + ~MaterialRectTexture2D()=default; bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override { @@ -68,8 +68,6 @@ void main() vsc->AddOutput(VAT_VEC4,"TexCoord"); - vsc->AddFunction(func::RectVertexPosition); - vsc->SetMain(vs_main); return(true); } @@ -80,7 +78,7 @@ void main() gsc->AddOutput(VAT_VEC2,"TexCoord"); - gsc->SetMain(fs_main); + gsc->SetMain(gs_main); return(true); } @@ -93,12 +91,17 @@ void main() fsc->SetMain(fs_main); return(true); } - };//class MaterialPureTexture2D:public Std2DMaterial + };//class MaterialRectTexture2D:public Std2DMaterial }//namespace -MaterialCreateInfo *CreatePureTexture2D(const mtl::Material2DCreateConfig *cfg) +MaterialCreateInfo *CreateRectTexture2D(mtl::Material2DCreateConfig *cfg) { - MaterialPureTexture2D mvc2d(cfg); + if(!cfg) + return(nullptr); + + cfg->shader_stage_flag_bit|=VK_SHADER_STAGE_GEOMETRY_BIT; + + MaterialRectTexture2D mvc2d(cfg); return mvc2d.Create(); } diff --git a/src/ShaderGen/ShaderCreateInfo.cpp b/src/ShaderGen/ShaderCreateInfo.cpp index 716f13ba..d3e948ca 100644 --- a/src/ShaderGen/ShaderCreateInfo.cpp +++ b/src/ShaderGen/ShaderCreateInfo.cpp @@ -186,7 +186,11 @@ bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc) final_shader+="\nlayout(location=0) in "; final_shader+=last_output; - final_shader+="Input;\n"; + + if(shader_stage==VK_SHADER_STAGE_GEOMETRY_BIT) + final_shader+="Input[];\n"; + else + final_shader+="Input;\n"; return(true); } @@ -308,7 +312,7 @@ bool ShaderCreateInfo::ProcSSBO() return(false); } -bool ShaderCreateInfo::ProcConst() +bool ShaderCreateInfo::ProcConstantID() { auto const_list=sdm->GetConstList(); @@ -377,6 +381,9 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc) ProcDefine(); + if(!ProcLayout()) + return(false); + if(!ProcSubpassInput()) return(false); if(!ProcInput(last_sc)) @@ -390,7 +397,7 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc) return(false); //if(!ProcSSBO()) //return(false); - if(!ProcConst()) + if(!ProcConstantID()) return(false); if(!ProcSampler()) return(false); diff --git a/src/ShaderGen/ShaderCreateInfoGeometry.cpp b/src/ShaderGen/ShaderCreateInfoGeometry.cpp index 9b108bc4..09a9410f 100644 --- a/src/ShaderGen/ShaderCreateInfoGeometry.cpp +++ b/src/ShaderGen/ShaderCreateInfoGeometry.cpp @@ -1,4 +1,4 @@ -#include +#include namespace hgl { @@ -24,5 +24,13 @@ namespace hgl max_vertices=mv; return(true); } + + bool ShaderCreateInfoGeometry::ProcLayout() + { + final_shader+="layout("+input_prim+") in;\n" + "layout("+output_prim+", max_vertices = "+AnsiString::numberOf(max_vertices)+") out;\n"; + + return(true); + } }//namespace graph }//namespace hgl diff --git a/src/ShaderGen/common/MFRectPrimitive.h b/src/ShaderGen/common/MFRectPrimitive.h index 983668ab..2822b6fd 100644 --- a/src/ShaderGen/common/MFRectPrimitive.h +++ b/src/ShaderGen/common/MFRectPrimitive.h @@ -17,30 +17,19 @@ vec4 GetPosition2D() R"( vec4 GetPosition2D() { - return vec4(Position.xy*2-1,Position.zw); + return vec4(Position.xy*2-1,Position.zw*2-1); } )", R"( vec4 GetPosition2D() { - vec4 tmp=viewport.ortho_matrix*vec4(Position.xy,0,1); + vec4 lt=viewport.ortho_matrix*vec4(Position.xy,0,1); + vec4 rb=viewport.ortho_matrix*vec4(Position.zw,0,1); - return vec4(tmp.xy,Position.zw); + return vec4(lt.xy,rb.xy); } )" }; - - constexpr const char RectVertexPosition[]=R"( -vec4 RectVertexPosition(vec4 pos) -{ - vec4 lt=vec4(pos.xy,vec2(0,1)); - vec4 rb=vec4(pos.zw,vec2(0,1)); - vec4 lt_fin=g_camera.ortho*lt; - vec4 rb_fin=g_camera.ortho*rb; - - return vec4(lt_fin.xy,rb_fin.xy); -} -)"; }//namespace func STD_MTL_NAMESPACE_END