Added Billboard2DWay.cpp and test OK! next step is fixed billboard pixel size.

This commit is contained in:
hyzboy 2024-06-16 22:58:45 +08:00
parent 23197e147c
commit c61e4dfdb8
12 changed files with 161 additions and 34 deletions

@ -1 +1 @@
Subproject commit c93bbb8296944843f9abe778ab26a0ff432455fa
Subproject commit d218c7435039d1932f6d79f3894ba1b74b22f4fe

View File

@ -14,10 +14,9 @@
using namespace hgl;
using namespace hgl::graph;
static float position_data[2][3]=
static float position_data[3]=
{
{100,100,100},
{0,0,0}
0,0,0
};
static float lumiance_data[2]={1,1};
@ -38,12 +37,12 @@ private:
Pipeline * pipeline_plane_grid =nullptr;
Primitive * prim_plane_grid =nullptr;
Material * mtl_billboard =nullptr;
MaterialInstance * mi_billboard =nullptr;
Pipeline * pipeline_billboard =nullptr;
Primitive * prim_billboard =nullptr;
Renderable * ro_billboard =nullptr;
Ray ray;
Texture2D * texture =nullptr;
Sampler * sampler =nullptr;
private:
@ -71,22 +70,36 @@ private:
bool InitBillboardMP()
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2DWay",Prim::TriangleStrip);
cfg.local_to_world=true;
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2DWay",Prim::Billboard2DWay);
{
mtl_billboard=db->LoadMaterial("Std3D/Billboard/2DWay",&cfg);
if(!mtl_billboard)return(false);
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateBillboard2DWay(&cfg);
mi_billboard=db->CreateMaterialInstance(mtl_billboard,nullptr,&yellow_color);
mi_billboard=db->CreateMaterialInstance(mci);
if(!mi_billboard)return(false);
pipeline_billboard=CreatePipeline(mtl_billboard,InlinePipeline::Solid3D,Prim::Billboard2DWay);
pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,Prim::Billboard2DWay);
if(!pipeline_billboard)return(false);
}
return(true);
}
bool InitTexture()
{
texture=db->LoadTexture2D(OS_TEXT("res/image/lena.Tex2D"),true);
if(!texture)return(false);
sampler=db->CreateSampler();
if(!mi_billboard->GetMaterial()->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
return(true);
}
Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p)
{
@ -121,6 +134,19 @@ private:
prim_plane_grid=CreatePlaneGrid(&pc,&pgci);
}
{
PrimitiveCreater pc(device,mi_billboard->GetVIL());
pc.Init("Billboard",1);
if(!pc.WriteVAB(VAN::Position,VF_V3F,position_data))
return(false);
ro_billboard=db->CreateRenderable(&pc,mi_billboard,pipeline_billboard);
if(!ro_billboard)
return(false);
}
return(true);
}
@ -128,6 +154,8 @@ private:
{
Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid);
render_root.CreateSubNode(ro_billboard);
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
@ -153,6 +181,12 @@ public:
if(!InitPlaneGridMP())
return(false);
if(!InitBillboardMP())
return(false);
if(!InitTexture())
return(false);
if(!CreateRenderObject())
return(false);
@ -161,16 +195,6 @@ public:
return(true);
}
void BuildCommandBuffer(uint32 index) override
{
const CameraInfo &ci=GetCameraInfo();
const ViewportInfo &vi=GetViewportInfo();
ray.Set(GetMouseCoord(),&ci,&vi); //设置射线查询的屏幕坐标点
SceneAppFramework::BuildCommandBuffer(index);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)

View File

@ -53,6 +53,7 @@ public:
MaterialCreateInfo *CreateVertexColor3D(const Material3DCreateConfig *);
MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *);
MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *);
/**
*

View File

@ -39,8 +39,8 @@ constexpr const ShaderBufferSource SBS_CameraInfo=
vec3 view_line; //pos-target
vec3 world_up;
vec3 camera_up;
vec3 camera_right;
vec3 billboard_up;
vec3 billboard_right;
float znear,zfar;)"
};

View File

@ -1,4 +1,4 @@
#ifndef HGL_SHADER_CREATE_INFO_INCLUDE
#ifndef HGL_SHADER_CREATE_INFO_INCLUDE
#define HGL_SHADER_CREATE_INFO_INCLUDE
#include<hgl/graph/VertexAttrib.h>

View File

@ -20,7 +20,7 @@ void main()
constexpr const char fs_main[]=R"(
void main()
{
FragColor=texture(TextureColor,Input.TexCoord);
FragColor=texture(TextureBaseColor,Input.TexCoord);
})";
class MaterialPureTexture2D:public Std2DMaterial

View File

@ -37,7 +37,7 @@ void main()
constexpr const char fs_main[]=R"(
void main()
{
FragColor=texture(TextureColor,Input.TexCoord);
FragColor=texture(TextureBaseColor,Input.TexCoord);
})";
class MaterialRectTexture2D:public Std2DMaterial

View File

@ -44,7 +44,7 @@ void main()
{
MaterialInstance mi=GetMI();
FragColor=texture(TextureColor,vec3(Input.TexCoord,mi.id.x));
FragColor=texture(TextureBaseColor,vec3(Input.TexCoord,mi.id.x));
})";
class MaterialRectTexture2D:public Std2DMaterial

View File

@ -0,0 +1,101 @@
#include"Std3DMaterial.h"
#include<hgl/shadergen/MaterialCreateInfo.h>
STD_MTL_NAMESPACE_BEGIN
namespace
{
constexpr const char vs_main[]=R"(
void main()
{
Output.l2w_id=Assign.x;
gl_Position=vec4(Position,1);
})";
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=camera.vp
*l2w.mats[Input[0].l2w_id]
*vec4( gl_in[0].gl_Position.xyz+
BillboardVertex[i].x*camera.billboard_right+
BillboardVertex[i].y*camera.billboard_up,
1
);
Output.TexCoord=vec2(BillboardVertex[i].x+0.5,BillboardVertex[i].y*-1+0.5);
EmitVertex();
}
EndPrimitive();
})";
constexpr const char fs_main[]=R"(
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
})";
class MaterialBillboard2DWay:public Std3DMaterial
{
public:
using Std3DMaterial::Std3DMaterial;
~MaterialBillboard2DWay()=default;
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{
if(!Std3DMaterial::CustomVertexShader(vsc))
return(false);
vsc->AddOutput(VAT_UINT,"l2w_id",Interpolation::Flat);
vsc->SetMain(vs_main);
return(true);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override
{
gsc->SetGeom(Prim::Points,Prim::TriangleStrip,4);
gsc->AddOutput(VAT_VEC2,"TexCoord");
gsc->SetMain(gs_main);
return(true);
}
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override
{
mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2D,mtl::SamplerName::BaseColor);
fsc->AddOutput(VAT_VEC4,"FragColor"); //Fragment shader的输出等于最终的RT了所以这个名称其实随便起。
fsc->SetMain(fs_main);
return(true);
}
};//class MaterialBillboard2DWay:public Std3DMaterial
}//namespace
MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *cfg)
{
if(!cfg)
return(nullptr);
cfg->shader_stage_flag_bit|=VK_SHADER_STAGE_GEOMETRY_BIT;
cfg->local_to_world=true;
MaterialBillboard2DWay mtl_billbard_2dway(cfg);
return mtl_billbard_2dway.Create();
}
STD_MTL_NAMESPACE_END

View File

@ -1,4 +1,4 @@
set(SHADERGEN_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/shadergen)
set(SHADERGEN_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/shadergen)
SET(SHADER_CREATER_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderCreateInfo.h
${SHADERGEN_INCLUDE_PATH}/ShaderCreateInfoMap.h
@ -69,6 +69,7 @@ SET(STD_MTL_3D_SOURCE_FILES ${STD_MTL_HEADER_PATH}/Material3DCreateConfig.h
3d/Std3DMaterialLoader.cpp
3d/M_VertexColor3D.cpp
3d/M_VertexLum3D.cpp
3d/M_Billboard2DWay.cpp
)
SET(STD_MTL_SOURCE ${STD_MTL_HEADER_PATH}/MaterialConfig.h