update examples codes.

This commit is contained in:
hyzboy 2020-10-19 22:26:42 +08:00
parent 7f38492dcc
commit 5972d075b3
7 changed files with 46 additions and 253 deletions

@ -1 +1 @@
Subproject commit 443e5d302bb1ef0b8fb2e0da6b95ff784e568354 Subproject commit 249c47d242c2e8dc4994581720984e55c0cc0ebe

View File

@ -23,8 +23,8 @@ static Vector4f color(1,1,1,1);
struct Line2DConfig struct Line2DConfig
{ {
float width=2.0f; float width=20.0f;
float border=0.75f; float border=5.0f;
}; };
static Line2DConfig line_2d_config; static Line2DConfig line_2d_config;

View File

View File

@ -19,24 +19,11 @@ VK_NAMESPACE_BEGIN
Texture2D *CreateTextureFromFile(Device *device,const OSString &filename); Texture2D *CreateTextureFromFile(Device *device,const OSString &filename);
VK_NAMESPACE_END VK_NAMESPACE_END
constexpr uint32_t SCREEN_WIDTH=256; constexpr uint32_t SCREEN_WIDTH=512;
constexpr uint32_t SCREEN_HEIGHT=256; constexpr uint32_t SCREEN_HEIGHT=512;
using Texture2DPointer=vulkan::Texture2D *; using Texture2DPointer=vulkan::Texture2D *;
constexpr VkFormat position_candidate_format[]={FMT_RGBA32F,FMT_RGBA16F};
constexpr VkFormat color_candidate_format []={FMT_RGBA32F,
FMT_RGBA16F,
FMT_RGBA8UN,FMT_RGBA8SN,FMT_RGBA8U,
FMT_BGRA8UN,FMT_BGRA8SN,FMT_BGRA8U,
FMT_ABGR8UN,FMT_ABGR8SN,FMT_ABGR8U,
FMT_RGB565,FMT_BGR565};
constexpr VkFormat normal_candidate_format []={FMT_RGBA32F,
FMT_RGBA16F,
FMT_A2RGB10UN,FMT_A2RGB10SN,FMT_A2BGR10UN,
FMT_A2BGR10SN};
constexpr VkFormat depth_candidate_format []={FMT_D32F,FMT_D32F_S8U,FMT_X8_D24UN,FMT_D24UN_S8U,FMT_D16UN,FMT_D16UN_S8U};
class TestApp:public CameraAppFramework class TestApp:public CameraAppFramework
{ {
private: private:
@ -44,42 +31,7 @@ private:
SceneNode render_root; SceneNode render_root;
RenderList render_list; RenderList render_list;
struct DeferredGBuffer vulkan::RenderTarget *gbuffer_rt;
{
vulkan::Semaphore *render_complete_semaphore =nullptr;
vulkan::RenderTarget *rt;
VkExtent2D extent;
vulkan::Framebuffer *framebuffer;
vulkan::RenderPass *renderpass;
union
{
struct
{
Texture2DPointer position,normal,color,depth;
};
Texture2DPointer texture_list[4];
};
List<VkFormat> gbuffer_format_list;
List<vulkan::ImageView *> image_view_list;
struct
{
List<VkAttachmentDescription> desc_list;
VkAttachmentReference *color_ref_list;
VkAttachmentReference depth_ref;
}attachment;
struct
{
List<VkSubpassDescription> desc;
List<VkSubpassDependency> dependency;
}subpass;
}gbuffer;//
struct SubpassParam struct SubpassParam
{ {
@ -120,104 +72,18 @@ public:
SAFE_CLEAR(texture.color); SAFE_CLEAR(texture.color);
SAFE_CLEAR(sampler); SAFE_CLEAR(sampler);
} }
private: private:
const VkFormat GetCandidateFormat(const VkFormat *fmt_list,const uint count)
{
auto pd=device->GetPhysicalDevice();
for(uint i=0;i<count;i++)
if(pd->IsColorAttachmentOptimal(fmt_list[i]))
return fmt_list[i];
for(uint i=0;i<count;i++)
if(pd->IsColorAttachmentLinear(fmt_list[i]))
return fmt_list[i];
return FMT_UNDEFINED;
}
const VkFormat GetDepthCandidateFormat()
{
auto pd=device->GetPhysicalDevice();
for(VkFormat fmt:depth_candidate_format)
if(pd->IsDepthAttachmentOptimal(fmt))
return fmt;
for(VkFormat fmt:depth_candidate_format)
if(pd->IsDepthAttachmentLinear(fmt))
return fmt;
return FMT_UNDEFINED;
}
bool InitGBuffer() bool InitGBuffer()
{ {
gbuffer.extent.width =1024; List<VkFormat> gbuffer_color_format;
gbuffer.extent.height =1024;
gbuffer.render_complete_semaphore =device->CreateSem(); gbuffer_color_format.Add(UFMT_RGBA32F); //position
gbuffer_color_format.Add(UFMT_RGBA32F); //color
gbuffer_color_format.Add(UFMT_RGBA32F); //normal
//根据候选格式表选择格式 gbuffer_rt=device->CreateRenderTarget(SCREEN_WIDTH,SCREEN_HEIGHT,gbuffer_color_format,FMT_D32F);
//const VkFormat position_format =GetCandidateFormat(position_candidate_format, sizeof(position_candidate_format));
//const VkFormat color_format =GetCandidateFormat(color_candidate_format, sizeof(color_candidate_format));
//const VkFormat normal_format =GetCandidateFormat(normal_candidate_format, sizeof(normal_candidate_format));
//const VkFormat depth_format =GetDepthCandidateFormat();
//if(position_format ==FMT_UNDEFINED
// ||color_format ==FMT_UNDEFINED
// ||normal_format ==FMT_UNDEFINED
// ||depth_format ==FMT_UNDEFINED)
// return(false);
const VkFormat position_format =FMT_RGBA32F;
const VkFormat color_format =FMT_RGBA32F;
const VkFormat normal_format =FMT_RGBA32F;
const VkFormat depth_format =FMT_D32F;
gbuffer.position=device->CreateAttachmentTextureColor(position_format, gbuffer.extent.width,gbuffer.extent.height);
gbuffer.color =device->CreateAttachmentTextureColor(color_format, gbuffer.extent.width,gbuffer.extent.height);
gbuffer.normal =device->CreateAttachmentTextureColor(normal_format, gbuffer.extent.width,gbuffer.extent.height);
gbuffer.depth =device->CreateAttachmentTextureDepth(depth_format, gbuffer.extent.width,gbuffer.extent.height);
for(uint i=0;i<3;i++)
{
gbuffer.gbuffer_format_list.Add(gbuffer.texture_list[i]->GetFormat());
gbuffer.image_view_list.Add(gbuffer.texture_list[i]->GetImageView());
}
gbuffer.attachment.color_ref_list=new VkAttachmentReference[3];
vulkan::CreateColorAttachmentReference(gbuffer.attachment.color_ref_list,3);
vulkan::CreateDepthAttachmentReference(&gbuffer.attachment.depth_ref);
if(!vulkan::CreateAttachmentDescription( gbuffer.attachment.desc_list,
gbuffer.gbuffer_format_list,
gbuffer.depth->GetFormat()))
return(false);
vulkan::SubpassDescription desc(gbuffer.attachment.color_ref_list,3,&gbuffer.attachment.depth_ref);
gbuffer.subpass.desc.Add(desc);
vulkan::CreateSubpassDependency(gbuffer.subpass.dependency,2); //为啥要2个还不清楚
gbuffer.renderpass=device->CreateRenderPass(gbuffer.attachment.desc_list,
gbuffer.subpass.desc,
gbuffer.subpass.dependency,
gbuffer.gbuffer_format_list,
gbuffer.depth->GetFormat());
if(!gbuffer.renderpass)
return(false);
gbuffer.framebuffer=vulkan::CreateFramebuffer(device->GetDevice(),gbuffer.renderpass,gbuffer.image_view_list,gbuffer.depth->GetImageView());
if(!gbuffer.framebuffer)
return(false);
gbuffer.rt=device->CreateRenderTarget(gbuffer.framebuffer);
return(true); return(true);
} }
@ -235,47 +101,20 @@ private:
bool InitGBufferPipeline(SubpassParam *sp) bool InitGBufferPipeline(SubpassParam *sp)
{ {
AutoDelete<vulkan::PipelineCreater> pipeline_creater=new vulkan::PipelineCreater(device,sp->material,gbuffer.rt); sp->pipeline_triangles =db->CreatePipeline(sp->material,gbuffer_rt,vulkan::InlinePipeline::Solid3D,Prim::Triangles);
if(!sp->pipeline_triangles)
return(false);
{ sp->pipeline_fan =db->CreatePipeline(sp->material,gbuffer_rt,vulkan::InlinePipeline::Solid3D,Prim::Fan);
pipeline_creater->Set(PRIM_TRIANGLES);
sp->pipeline_triangles=pipeline_creater->Create(); return sp->pipeline_fan;
if(!sp->pipeline_triangles)
return(false);
db->Add(sp->pipeline_triangles);
}
{
pipeline_creater->Set(PRIM_TRIANGLE_FAN);
sp->pipeline_fan=pipeline_creater->Create();
if(!sp->pipeline_fan)
return(false);
db->Add(sp->pipeline_fan);
}
return(true);
} }
bool InitCompositionPipeline(SubpassParam *sp) bool InitCompositionPipeline(SubpassParam *sp)
{ {
AutoDelete<vulkan::PipelineCreater> pipeline_creater=new vulkan::PipelineCreater(device,sp->material,sc_render_target); sp->pipeline_fan=db->CreatePipeline(sp->material,gbuffer_rt,vulkan::InlinePipeline::Solid2D,Prim::Fan);
pipeline_creater->SetDepthTest(false);
pipeline_creater->SetDepthWrite(false);
pipeline_creater->SetCullMode(VK_CULL_MODE_NONE);
pipeline_creater->Set(PRIM_TRIANGLE_FAN);
sp->pipeline_triangles=pipeline_creater->Create(); return sp->pipeline_fan;
if(!sp->pipeline_triangles)
return(false);
db->Add(sp->pipeline_triangles);
return(true);
} }
bool InitMaterial() bool InitMaterial()
@ -289,28 +128,7 @@ private:
texture.color =vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/Brickwall/Albedo.Tex2D")); texture.color =vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/Brickwall/Albedo.Tex2D"));
texture.normal =vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/Brickwall/Normal.Tex2D")); texture.normal =vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/Brickwall/Normal.Tex2D"));
VkSamplerCreateInfo sampler_create_info; sampler=device->CreateSampler();
sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
sampler_create_info.pNext = nullptr;
sampler_create_info.flags = 0;
sampler_create_info.magFilter = VK_FILTER_LINEAR;
sampler_create_info.minFilter = VK_FILTER_LINEAR;
sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
sampler_create_info.mipLodBias = 0.0f;
sampler_create_info.anisotropyEnable = false;
sampler_create_info.maxAnisotropy = 0;
sampler_create_info.compareEnable = false;
sampler_create_info.compareOp = VK_COMPARE_OP_NEVER;
sampler_create_info.minLod = 0.0f;
sampler_create_info.maxLod = 1.0f;
sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
sampler_create_info.unnormalizedCoordinates = false;
sampler=device->CreateSampler(&sampler_create_info);
InitCameraUBO(sp_gbuffer.material_instance,"world"); InitCameraUBO(sp_gbuffer.material_instance,"world");
@ -318,9 +136,9 @@ private:
sp_gbuffer.material_instance->BindSampler("TextureNormal" ,texture.normal, sampler); sp_gbuffer.material_instance->BindSampler("TextureNormal" ,texture.normal, sampler);
sp_gbuffer.material_instance->Update(); sp_gbuffer.material_instance->Update();
sp_composition.material_instance->BindSampler("GB_Position" ,gbuffer.position, sampler); sp_composition.material_instance->BindSampler("GB_Position" ,gbuffer_rt->GetColorTexture(0),sampler);
sp_composition.material_instance->BindSampler("GB_Normal" ,gbuffer.normal, sampler); sp_composition.material_instance->BindSampler("GB_Normal" ,gbuffer_rt->GetColorTexture(1),sampler);
sp_composition.material_instance->BindSampler("GB_Color" ,gbuffer.color, sampler); sp_composition.material_instance->BindSampler("GB_Color" ,gbuffer_rt->GetColorTexture(2),sampler);
sp_composition.material_instance->Update(); sp_composition.material_instance->Update();
return(true); return(true);
@ -459,7 +277,7 @@ public:
void BuildCommandBuffer(uint32_t index) override void BuildCommandBuffer(uint32_t index) override
{ {
VulkanApplicationFramework::BuildCommandBuffer( index, VulkanApplicationFramework::BuildCommandBuffer( index,
sp_composition.pipeline_triangles, sp_composition.pipeline_fan,
sp_composition.material_instance, sp_composition.material_instance,
ro_gbc_plane); ro_gbc_plane);
} }

View File

@ -61,39 +61,9 @@ public:
bool Begin(); bool Begin();
void PipelineBarrier( template<typename ...ARGS> void PipelineBarrier (ARGS...args){vkCmdPipelineBarrier (cmd_buf,args...);}
VkPipelineStageFlags srcStageMask, template<typename ...ARGS> void CopyBufferToImage (ARGS...args){vkCmdCopyBufferToImage(cmd_buf,args...);}
VkPipelineStageFlags dstStageMask, template<typename ...ARGS> void CopyImageToBuffer (ARGS...args){vkCmdCopyImageToBuffer(cmd_buf,args...);}
VkDependencyFlags dependencyFlags,
uint32_t memoryBarrierCount,
const VkMemoryBarrier * pMemoryBarriers,
uint32_t bufferMemoryBarrierCount,
const VkBufferMemoryBarrier * pBufferMemoryBarriers,
uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier * pImageMemoryBarriers)
{
vkCmdPipelineBarrier(cmd_buf,srcStageMask,dstStageMask,dependencyFlags,memoryBarrierCount,pMemoryBarriers,bufferMemoryBarrierCount,pBufferMemoryBarriers,imageMemoryBarrierCount,pImageMemoryBarriers);
}
void CopyBufferToImage(
VkBuffer srcBuffer,
VkImage dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkBufferImageCopy * pRegions)
{
vkCmdCopyBufferToImage(cmd_buf,srcBuffer,dstImage,dstImageLayout,regionCount,pRegions);
}
void CopyImageToBuffer(
VkImage srcImage,
VkImageLayout srcImageLayout,
VkBuffer dstBuffer,
uint32_t regionCount,
const VkBufferImageCopy * pRegions)
{
vkCmdCopyImageToBuffer(cmd_buf,srcImage,srcImageLayout,dstBuffer,regionCount,pRegions);
}
bool BindFramebuffer(VkRenderPass rp,VkFramebuffer fb); bool BindFramebuffer(VkRenderPass rp,VkFramebuffer fb);
bool BindFramebuffer(Framebuffer *); bool BindFramebuffer(Framebuffer *);
@ -140,18 +110,13 @@ public:
void SetStencilWriteMask (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilWriteMask(cmd_buf,faceMask,compareMask);} void SetStencilWriteMask (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilWriteMask(cmd_buf,faceMask,compareMask);}
void SetStencilReference (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilReference(cmd_buf,faceMask,compareMask);} void SetStencilReference (VkStencilFaceFlags faceMask,uint32_t compareMask) {vkCmdSetStencilReference(cmd_buf,faceMask,compareMask);}
void Draw (const uint32_t vertex_count){vkCmdDraw(cmd_buf,vertex_count,1,0,0);} public: //draw
void DrawIndexed(const uint32_t index_count ){vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);}
void Draw (const uint32_t vertex_count, const uint32_t instance_count,const uint32_t first_vertex, const uint32_t first_instance)
{
vkCmdDraw(cmd_buf,vertex_count,instance_count,first_vertex,first_instance);
}
void DrawIndexed(const uint32_t index_count, const uint32_t instance_count,const uint32_t first_index, const uint32_t vertex_offset,const uint32_t first_instance) void Draw (const uint32_t vertex_count) {vkCmdDraw(cmd_buf,vertex_count,1,0,0);}
{ void DrawIndexed(const uint32_t index_count ) {vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);}
vkCmdDrawIndexed(cmd_buf,index_count,instance_count,first_index,vertex_offset,first_instance);
} template<typename ...ARGS> void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);}
template<typename ...ARGS> void DrawIndexed(ARGS...args) {vkCmdDrawIndexed(cmd_buf,args...);}
void NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);} void NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);}

View File

@ -15,8 +15,6 @@ namespace hgl
{ {
protected: //每个窗体独立一个FBO存在所以每个窗体会有自己的RenderTarget与pipeline protected: //每个窗体独立一个FBO存在所以每个窗体会有自己的RenderTarget与pipeline
vulkan::Buffer *ui_matrix;
struct struct
{ {
vulkan::Pipeline *solid; vulkan::Pipeline *solid;

View File

@ -2,6 +2,7 @@
#include<hgl/gui/ThemeEngine.h> #include<hgl/gui/ThemeEngine.h>
#include<hgl/graph/vulkan/VKMaterialInstance.h> #include<hgl/graph/vulkan/VKMaterialInstance.h>
#include<hgl/type/Map.h>
namespace hgl namespace hgl
{ {
@ -9,11 +10,20 @@ namespace hgl
{ {
using namespace hgl::graph; using namespace hgl::graph;
class Form; ///<窗体
/** /**
* GUI主题引擎 * GUI主题引擎
*/ */
class DefaultThemeEngine:public ThemeEngine class DefaultThemeEngine:public ThemeEngine
{ {
struct IForm
{
Form *form; ///<窗体控件
vulkan::RenderTarget *rt; ///<渲染目标
};//
MapObject<Form *,IForm> form_list;
struct struct
{ {
@ -26,7 +36,9 @@ namespace hgl
bool Init() override; bool Init() override;
void Clear() override; void Clear() override;
void DrawFrame(const Widget *) override; bool Registry(Form *);
void Unregistry(Form *);
void Render(Form *);
};//class DefaultThemeEngine:public ThemeEngine };//class DefaultThemeEngine:public ThemeEngine
}//namespace gui }//namespace gui
}//namespace hgl }//namespace hgl