Billboard Shader增加可指定正面为顺时针/逆时针

This commit is contained in:
2025-06-25 02:04:36 +08:00
parent eb2be07ee1
commit 27e5d0bdca
4 changed files with 46 additions and 18 deletions

View File

@@ -66,6 +66,8 @@ struct BillboardMaterialCreateConfig:public Material3DCreateConfig
Vector2u pixel_size; ///<像素尺寸
VkFrontFace front_face=VK_FRONT_FACE_CLOCKWISE; ///<正面朝向
public:
using Material3DCreateConfig::Material3DCreateConfig;

View File

@@ -1,4 +1,5 @@
#include"Std3DMaterial.h"
#include"S_BillboardVertex.h"
#include<hgl/shadergen/MaterialCreateInfo.h>
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);
}

View File

@@ -1,4 +1,5 @@
#include"Std3DMaterial.h"
#include"S_BillboardVertex.h"
#include<hgl/shadergen/MaterialCreateInfo.h>
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);
}

View File

@@ -0,0 +1,28 @@
#pragma once
#include<hgl/graph/mtl/StdMaterial.h>
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