From f9905396339732bf7a858908e332aa9805cc3579 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Tue, 21 Feb 2023 18:35:08 +0800 Subject: [PATCH] supported half_float and 8bit unorm format at first_triangle example. --- example/Vulkan/first_triangle.cpp | 69 ++++++++++++++++++++++++----- example/Vulkan/second_triangle.cpp | 4 +- example/Vulkan/texture_rect.cpp | 2 +- example/common/VulkanAppFramework.h | 2 +- 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 6d1e17dc..ba81278b 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -3,6 +3,7 @@ #include"VulkanAppFramework.h" #include +#include #include #include @@ -14,19 +15,47 @@ constexpr uint32_t SCREEN_HEIGHT=720; constexpr uint32_t VERTEX_COUNT=3; -constexpr float position_data[VERTEX_COUNT][2]= +constexpr float position_data_float[VERTEX_COUNT*2]= { - { 0.0, -0.5}, - {-0.5, 0.5}, - { 0.5, 0.5} + 0.0, -0.5, + -0.5, 0.5, + 0.5, 0.5 }; -constexpr float color_data[VERTEX_COUNT][4]= -{ {1,0,0,1}, - {0,1,0,1}, - {0,0,1,1} +#define USE_HALF_FLOAT_POSITION + +#ifdef USE_HALF_FLOAT_POSITION +constexpr VkFormat PositionFormat=VF_V2HF; + +half_float position_data_hf[VERTEX_COUNT*2]; + +#define position_data position_data_hf +#else +constexpr VkFormat PositionFormat=VF_V2F; + +#define position_data position_data_float +#endif//USE_HALF_FLOAT_POSITION + +#define USE_UNORM8_COLOR + +#ifdef USE_UNORM8_COLOR +constexpr uint8 color_data[VERTEX_COUNT*4]= +{ 255,0,0,255, + 0,255,0,255, + 0,0,255,255 }; +constexpr VkFormat ColorFormat=VF_V4UN8; +#else +constexpr float color_data[VERTEX_COUNT*4]= +{ 1,0,0,1, + 0,1,0,1, + 0,0,1,1 +}; + +constexpr VkFormat ColorFormat=VF_V4F; +#endif//USE_UNORM8_COLOR + class TestApp:public VulkanApplicationFramework { private: @@ -40,11 +69,25 @@ private: bool InitMaterial() { +#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR) + VILConfig vil_config; + + #ifdef USE_HALF_FLOAT_POSITION + vil_config.Add(VAN::Position,PositionFormat); + #endif//USE_HALF_FLOAT_POSITION + + #ifdef USE_UNORM8_COLOR + vil_config.Add(VAN::Color,ColorFormat); + #endif//USE_HALF_FLOAT_POSITION + + material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"),&vil_config); +#else material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC")); +#endif// 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 @@ -56,8 +99,12 @@ private: Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT); if(!primitive)return(false); - if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data )))return(false); - if(!primitive->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data )))return(false); +#ifdef USE_HALF_FLOAT_POSITION + Float32toFloat16(position_data_hf,position_data_float,VERTEX_COUNT*2); +#endif//USE_HALF_FLOAT_POSITION + + if(!primitive->Set(VAN::Position, db->CreateVBO(PositionFormat, VERTEX_COUNT,position_data )))return(false); + if(!primitive->Set(VAN::Color, db->CreateVBO(ColorFormat, VERTEX_COUNT,color_data )))return(false); render_obj=db->CreateRenderable(primitive,material_instance,pipeline); return(render_obj); diff --git a/example/Vulkan/second_triangle.cpp b/example/Vulkan/second_triangle.cpp index abfd733e..4533abb9 100644 --- a/example/Vulkan/second_triangle.cpp +++ b/example/Vulkan/second_triangle.cpp @@ -59,8 +59,8 @@ private: Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT); if(!primitive)return(false); - if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data )))return(false); - if(!primitive->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data )))return(false); + if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data )))return(false); + if(!primitive->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data )))return(false); render_obj=db->CreateRenderable(primitive,material_instance,pipeline); return(true); diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index af6f8d6a..515dcab6 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -50,7 +50,7 @@ private: Texture2D * texture =nullptr; Sampler * sampler =nullptr; MaterialInstance * material_instance =nullptr; - Renderable *renderable =nullptr; + Renderable * renderable =nullptr; Pipeline * pipeline =nullptr; private: diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 2fb2942d..5081b8e3 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -61,7 +61,7 @@ protected: protected: Camera * camera =nullptr; - DeviceBuffer * ubo_camera_info =nullptr; + DeviceBuffer * ubo_camera_info =nullptr; public: