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