diff --git a/CMSceneGraph b/CMSceneGraph index c93bbb82..d218c743 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit c93bbb8296944843f9abe778ab26a0ff432455fa +Subproject commit d218c7435039d1932f6d79f3894ba1b74b22f4fe diff --git a/example/Basic/Billboard2DWay.cpp b/example/Basic/Billboard2DWay.cpp index d8067c2f..dc42994d 100644 --- a/example/Basic/Billboard2DWay.cpp +++ b/example/Basic/Billboard2DWay.cpp @@ -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 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 **) diff --git a/example/Gizmo/PlaneGrid3D.cpp b/example/Gizmo/PlaneGrid3D.cpp index 35e17352..af9cb0f3 100644 --- a/example/Gizmo/PlaneGrid3D.cpp +++ b/example/Gizmo/PlaneGrid3D.cpp @@ -44,7 +44,7 @@ private: ce=COLOR((int)ce+1); } - + pipeline=CreatePipeline(material,InlinePipeline::Solid3D,Prim::Lines); return pipeline; diff --git a/example/Texture/texture_rect.cpp b/example/Texture/texture_rect.cpp index f59805cf..71722b11 100644 --- a/example/Texture/texture_rect.cpp +++ b/example/Texture/texture_rect.cpp @@ -69,7 +69,7 @@ private: sampler=db->CreateSampler(); if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集 - mtl::SamplerName::BaseColor, ///<采样器名称 + mtl::SamplerName::BaseColor, ///<采样器名称 texture, ///<纹理 sampler)) ///<采样器 return(false); diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index b3fc6195..e001f200 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -53,6 +53,7 @@ public: MaterialCreateInfo *CreateVertexColor3D(const Material3DCreateConfig *); MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *); +MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *); /** * 从文件加载材质 diff --git a/inc/hgl/graph/mtl/UBOCommon.h b/inc/hgl/graph/mtl/UBOCommon.h index d82d01ad..3c87a22d 100644 --- a/inc/hgl/graph/mtl/UBOCommon.h +++ b/inc/hgl/graph/mtl/UBOCommon.h @@ -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;)" }; diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index 57a6dd67..dc5308e0 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -1,4 +1,4 @@ -#ifndef HGL_SHADER_CREATE_INFO_INCLUDE +#ifndef HGL_SHADER_CREATE_INFO_INCLUDE #define HGL_SHADER_CREATE_INFO_INCLUDE #include diff --git a/src/ShaderGen/2d/M_PureTexture2D.cpp b/src/ShaderGen/2d/M_PureTexture2D.cpp index ee07d285..ac82ba09 100644 --- a/src/ShaderGen/2d/M_PureTexture2D.cpp +++ b/src/ShaderGen/2d/M_PureTexture2D.cpp @@ -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 diff --git a/src/ShaderGen/2d/M_RectTexture2D.cpp b/src/ShaderGen/2d/M_RectTexture2D.cpp index 015c9cf8..b2a3c534 100644 --- a/src/ShaderGen/2d/M_RectTexture2D.cpp +++ b/src/ShaderGen/2d/M_RectTexture2D.cpp @@ -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 diff --git a/src/ShaderGen/2d/M_RectTexture2DArray.cpp b/src/ShaderGen/2d/M_RectTexture2DArray.cpp index 6bd8d78d..90472093 100644 --- a/src/ShaderGen/2d/M_RectTexture2DArray.cpp +++ b/src/ShaderGen/2d/M_RectTexture2DArray.cpp @@ -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 diff --git a/src/ShaderGen/3d/M_Billboard2DWay.cpp b/src/ShaderGen/3d/M_Billboard2DWay.cpp new file mode 100644 index 00000000..cb97b225 --- /dev/null +++ b/src/ShaderGen/3d/M_Billboard2DWay.cpp @@ -0,0 +1,101 @@ +#include"Std3DMaterial.h" +#include + +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 diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index f8e1a0a1..d0e27ea2 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -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