From 27e5d0bdca7fd113788f8f37f1b74cb3c8affd7f Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 25 Jun 2025 02:04:36 +0800 Subject: [PATCH] =?UTF-8?q?Billboard=20Shader=E5=A2=9E=E5=8A=A0=E5=8F=AF?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=AD=A3=E9=9D=A2=E4=B8=BA=E9=A1=BA=E6=97=B6?= =?UTF-8?q?=E9=92=88/=E9=80=86=E6=97=B6=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/graph/mtl/Material3DCreateConfig.h | 2 ++ src/ShaderGen/3d/M_BillboardDynamicSize.cpp | 17 ++++++------- src/ShaderGen/3d/M_BillboardFixedSize.cpp | 17 ++++++------- src/ShaderGen/3d/S_BillboardVertex.h | 28 +++++++++++++++++++++ 4 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 src/ShaderGen/3d/S_BillboardVertex.h diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index d9847ad3..97aed9bd 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -66,6 +66,8 @@ struct BillboardMaterialCreateConfig:public Material3DCreateConfig Vector2u pixel_size; ///<像素尺寸 + VkFrontFace front_face=VK_FRONT_FACE_CLOCKWISE; ///<正面朝向 + public: using Material3DCreateConfig::Material3DCreateConfig; diff --git a/src/ShaderGen/3d/M_BillboardDynamicSize.cpp b/src/ShaderGen/3d/M_BillboardDynamicSize.cpp index 12c8f484..1acda133 100644 --- a/src/ShaderGen/3d/M_BillboardDynamicSize.cpp +++ b/src/ShaderGen/3d/M_BillboardDynamicSize.cpp @@ -1,4 +1,5 @@ #include"Std3DMaterial.h" +#include"S_BillboardVertex.h" #include STD_MTL_NAMESPACE_BEGIN @@ -14,14 +15,6 @@ void main() constexpr const char gs_main[]=R"( void main() { - const vec2 BillboardVertex[4]=vec2[] - ( - vec2(-0.5,-0.5), - vec2( 0.5,-0.5), - vec2(-0.5, 0.5), - vec2( 0.5, 0.5) - ); - mat4 MVPMatrix=camera.vp*l2w.mats[Input[0].l2w_id]; for(int i=0;i<4;i++) @@ -48,9 +41,14 @@ void main() class MaterialBillboard2DDynamicSize:public Std3DMaterial { + mtl::BillboardMaterialCreateConfig *billboard_config; + public: - using Std3DMaterial::Std3DMaterial; + MaterialBillboard2DDynamicSize(mtl::BillboardMaterialCreateConfig *bcfg):Std3DMaterial(bcfg) + { + billboard_config=bcfg; + } ~MaterialBillboard2DDynamicSize()=default; bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override @@ -70,6 +68,7 @@ void main() gsc->AddOutput(SVT_VEC2,"TexCoord"); + gsc->AddUserData(billboard_config->front_face==VK_FRONT_FACE_CLOCKWISE?shader_billboard_vertex_cw:shader_billboard_vertex_ccw); gsc->SetMain(gs_main); return(true); } diff --git a/src/ShaderGen/3d/M_BillboardFixedSize.cpp b/src/ShaderGen/3d/M_BillboardFixedSize.cpp index 0d012674..84efab4c 100644 --- a/src/ShaderGen/3d/M_BillboardFixedSize.cpp +++ b/src/ShaderGen/3d/M_BillboardFixedSize.cpp @@ -1,4 +1,5 @@ #include"Std3DMaterial.h" +#include"S_BillboardVertex.h" #include STD_MTL_NAMESPACE_BEGIN @@ -21,14 +22,6 @@ void main() constexpr const char gs_main[]=R"( void main() { - const vec2 BillboardVertex[4]=vec2[] - ( - vec2(-0.5,-0.5), - vec2(-0.5, 0.5), - vec2( 0.5,-0.5), - vec2( 0.5, 0.5) - ); - for(int i=0;i<4;i++) { gl_Position=gl_in[0].gl_Position; @@ -49,9 +42,14 @@ void main() class MaterialBillboard2DFixedSize:public Std3DMaterial { + mtl::BillboardMaterialCreateConfig *billboard_config; + public: - using Std3DMaterial::Std3DMaterial; + MaterialBillboard2DFixedSize(mtl::BillboardMaterialCreateConfig *bcfg):Std3DMaterial(bcfg) + { + billboard_config=bcfg; + } ~MaterialBillboard2DFixedSize()=default; bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override @@ -71,6 +69,7 @@ void main() gsc->AddOutput(SVT_VEC2,"TexCoord"); + gsc->AddUserData(billboard_config->front_face==VK_FRONT_FACE_CLOCKWISE?shader_billboard_vertex_cw:shader_billboard_vertex_ccw); gsc->SetMain(gs_main); return(true); } diff --git a/src/ShaderGen/3d/S_BillboardVertex.h b/src/ShaderGen/3d/S_BillboardVertex.h new file mode 100644 index 00000000..5b660aa4 --- /dev/null +++ b/src/ShaderGen/3d/S_BillboardVertex.h @@ -0,0 +1,28 @@ +#pragma once +#include + +STD_MTL_NAMESPACE_BEGIN + +// 注意:走的几何Shader,输出是三角形条 + +constexpr const char shader_billboard_vertex_ccw[]=R"( +const vec2 BillboardVertex[4]=vec2[] +( + vec2(-0.5,-0.5), + vec2(-0.5, 0.5), + vec2( 0.5,-0.5), + vec2( 0.5, 0.5) +); +)"; + +constexpr const char shader_billboard_vertex_cw[]=R"( +const vec2 BillboardVertex[4]=vec2[] +( + vec2(-0.5,-0.5), + vec2( 0.5,-0.5), + vec2(-0.5, 0.5), + vec2( 0.5, 0.5) +); +)"; + +STD_MTL_NAMESPACE_END