diff --git a/example/Vulkan/fourth_triangle.cpp b/example/Vulkan/fourth_triangle.cpp new file mode 100644 index 00000000..eed65cf6 --- /dev/null +++ b/example/Vulkan/fourth_triangle.cpp @@ -0,0 +1,134 @@ +// fourth_triangle +// 该范例主要演示使用材质实例传递颜色参数绘制三角形 + +#include"VulkanAppFramework.h" +#include +#include +#include +#include +#include + +using namespace hgl; +using namespace hgl::graph; + +constexpr uint32_t SCREEN_WIDTH=1024; +constexpr uint32_t SCREEN_HEIGHT=1024; + +constexpr uint32_t VERTEX_COUNT=3; + +constexpr float position_data[VERTEX_COUNT*2]= +{ + 0.0, 0.0, + -0.1, 0.9, + 0.1, 0.9 +}; + +constexpr float color_data[3][4]= +{ + {1,0,0,1}, + {0,1,0,1}, + {0,0,1,1} +}; + +class TestApp:public VulkanApplicationFramework +{ +private: + + SceneNode render_root; + RenderList * render_list =nullptr; + + MaterialInstance * material_instance =nullptr; + Renderable * render_obj =nullptr; + + Pipeline * pipeline =nullptr; + +private: + + bool InitMaterial() + { + { + mtl::Material2DConfig cfg("PureColor2D"); + + cfg.coordinate_system=CoordinateSystem2D::NDC; + cfg.local_to_world=true; + + AutoDelete mci=mtl::CreatePureColor2D(&cfg); + + material_instance=db->CreateMaterialInstance(mci); + } + + if(!material_instance) + return(false); + +// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); + pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target + + return pipeline; + } + + bool InitVBO() + { + RenderablePrimitiveCreater rpc(db,VERTEX_COUNT); + + if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false); + if(!rpc.SetVBO(VAN::Color, VF_V4F, color_data ))return(false); + + render_obj=rpc.Create(material_instance,pipeline); + + if(!render_obj) + return(false); + + for(uint i=0;i<12;i++) + render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj); + + render_root.RefreshMatrix(); + + render_list->Expend(&render_root); + + return(true); + } + +public: + + ~TestApp() + { + SAFE_CLEAR(render_list); + } + + bool Init() + { + if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) + return(false); + + render_list=new RenderList(device); + + if(!InitMaterial()) + return(false); + + if(!InitVBO()) + return(false); + + BuildCommandBuffer(render_list); + + return(true); + } + + void Resize(int w,int h)override + { + VulkanApplicationFramework::Resize(w,h); + + BuildCommandBuffer(render_list); + } +};//class TestApp:public VulkanApplicationFramework + +int main(int,char **) +{ + TestApp app; + + if(!app.Init()) + return(-1); + + while(app.Run()); + + return 0; +} diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 9af0be56..3f0a5877 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -49,7 +49,7 @@ IndexBuffer *RenderResource::CreateIBO(IndexType index_type,uint32_t count,const rm_buffers.Add(buf); return(buf); } - + MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl,const VILConfig *vil_cfg) { if(!mtl)return(nullptr);