Added Billboard2DWay.cpp and test OK! next step is fixed billboard pixel size.
This commit is contained in:
parent
23197e147c
commit
c61e4dfdb8
@ -1 +1 @@
|
||||
Subproject commit c93bbb8296944843f9abe778ab26a0ff432455fa
|
||||
Subproject commit d218c7435039d1932f6d79f3894ba1b74b22f4fe
|
@ -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;
|
||||
|
||||
Ray ray;
|
||||
Renderable * ro_billboard =nullptr;
|
||||
|
||||
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 **)
|
||||
|
@ -44,7 +44,7 @@ private:
|
||||
|
||||
ce=COLOR((int)ce+1);
|
||||
}
|
||||
|
||||
|
||||
pipeline=CreatePipeline(material,InlinePipeline::Solid3D,Prim::Lines);
|
||||
|
||||
return pipeline;
|
||||
|
@ -69,7 +69,7 @@ private:
|
||||
sampler=db->CreateSampler();
|
||||
|
||||
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
|
||||
mtl::SamplerName::BaseColor, ///<采样器名称
|
||||
mtl::SamplerName::BaseColor, ///<采样器名称
|
||||
texture, ///<纹理
|
||||
sampler)) ///<采样器
|
||||
return(false);
|
||||
|
@ -53,6 +53,7 @@ public:
|
||||
|
||||
MaterialCreateInfo *CreateVertexColor3D(const Material3DCreateConfig *);
|
||||
MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *);
|
||||
MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *);
|
||||
|
||||
/**
|
||||
* 从文件加载材质
|
||||
|
@ -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;)"
|
||||
};
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
101
src/ShaderGen/3d/M_Billboard2DWay.cpp
Normal file
101
src/ShaderGen/3d/M_Billboard2DWay.cpp
Normal 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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user