diff --git a/example/Vulkan/Deferred.cpp b/example/Vulkan/Deferred.cpp index 1829553c..c1fa579b 100644 --- a/example/Vulkan/Deferred.cpp +++ b/example/Vulkan/Deferred.cpp @@ -219,7 +219,8 @@ private: AutoDelete pipeline_creater=new vulkan::PipelineCreater(device,sp->material,gbuffer.renderpass,gbuffer.extent); pipeline_creater->SetDepthTest(true); pipeline_creater->SetDepthWrite(true); - pipeline_creater->SetCullMode(VK_CULL_MODE_BACK_BIT); + //pipeline_creater->SetCullMode(VK_CULL_MODE_BACK_BIT); + pipeline_creater->SetCullMode(VK_CULL_MODE_NONE); pipeline_creater->Set(PRIM_TRIANGLES); sp->pipeline=pipeline_creater->Create(); @@ -360,13 +361,13 @@ private: bool InitScene(SubpassParam *sp) { CreateRenderObject(sp->material); - - render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_plane_grid)); - render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_torus)); - render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cube ),translate(-10, 0, 5)*scale(10,10,10)); - render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_sphere ),translate( 10, 0, 5)*scale(10,10,10)); - render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cylinder ),translate( 0, 16, 0)); - render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cone ),translate( 0,-16, 0)); + render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cube),scale(50,50,50)); + //render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_plane_grid)); + //render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_torus)); + //render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cube ),translate(-10, 0, 5)*scale(10,10,10)); + //render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_sphere ),translate( 10, 0, 5)*scale(10,10,10)); + //render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cylinder ),translate( 0, 16, 0)); + //render_root.Add(db->CreateRenderableInstance(sp->pipeline,sp->desc_sets,ro_cone ),translate( 0,-16, 0)); render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); @@ -376,7 +377,7 @@ private: bool InitGBufferCommandBuffer() { - gbuffer_cmd=device->CreateCommandBuffer(&gbuffer.extent); + gbuffer_cmd=device->CreateCommandBuffer(&gbuffer.extent,gbuffer.attachment.desc_list.GetCount()); if(!gbuffer_cmd) return(false); diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index ee2ba823..2ddc4d89 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -137,10 +137,12 @@ public: swap_chain_count=device->GetSwapChainImageCount(); { + const VkExtent2D extent=device->GetExtent(); + cmd_buf=hgl_zero_new(swap_chain_count); for(uint i=0;iCreateCommandBuffer(); + cmd_buf[i]=device->CreateCommandBuffer(&extent,2); } } diff --git a/inc/hgl/graph/vulkan/VK.h b/inc/hgl/graph/vulkan/VK.h index a7d2eb01..491c4e4d 100644 --- a/inc/hgl/graph/vulkan/VK.h +++ b/inc/hgl/graph/vulkan/VK.h @@ -69,6 +69,13 @@ struct PushConstant Matrix4f local_to_world; }; +inline void copy(VkExtent3D &e3d,const VkExtent2D &e2d) +{ + e3d.width =e2d.width; + e3d.height =e2d.height; + e3d.depth =1; +} + #ifdef _DEBUG bool CheckStrideBytesByFormat(); ///<检验所有数据类型长度数组是否符合规则 #endif//_DEBUG diff --git a/inc/hgl/graph/vulkan/VKCommandBuffer.h b/inc/hgl/graph/vulkan/VKCommandBuffer.h index 4f23c983..a78ffb42 100644 --- a/inc/hgl/graph/vulkan/VKCommandBuffer.h +++ b/inc/hgl/graph/vulkan/VKCommandBuffer.h @@ -13,7 +13,8 @@ class CommandBuffer VkCommandPool pool; VkCommandBuffer cmd_buf; - VkClearValue clear_values[2]; + uint32_t cv_count; + VkClearValue *clear_values; VkRect2D render_area; VkViewport viewport; @@ -21,7 +22,7 @@ class CommandBuffer public: - CommandBuffer(VkDevice dev,const VkExtent2D &extent,VkCommandPool cp,VkCommandBuffer cb); + CommandBuffer(VkDevice dev,const VkExtent2D &extent,const uint32_t att_count,VkCommandPool cp,VkCommandBuffer cb); ~CommandBuffer(); operator VkCommandBuffer(){return cmd_buf;} @@ -29,18 +30,26 @@ public: operator const VkCommandBuffer *()const{return &cmd_buf;} void SetRenderArea(const VkRect2D &ra){render_area=ra;} - void SetClearColor(float r,float g,float b,float a=1.0f) + void SetClearColor(int index,float r,float g,float b,float a=1.0f) { - clear_values[0].color.float32[0]=r; - clear_values[0].color.float32[1]=g; - clear_values[0].color.float32[2]=b; - clear_values[0].color.float32[3]=a; + if(index<0||index>cv_count)return; + + VkClearValue *cv=clear_values+index; + + cv->color.float32[0]=r; + cv->color.float32[1]=g; + cv->color.float32[2]=b; + cv->color.float32[3]=a; } - void SetClearDepthStencil(float d=1.0f,float s=0) + void SetClearDepthStencil(int index,float d=1.0f,float s=0) { - clear_values[1].depthStencil.depth=d; - clear_values[1].depthStencil.stencil=s; + if(index<0||index>cv_count)return; + + VkClearValue *cv=clear_values+index; + + cv->depthStencil.depth=d; + cv->depthStencil.stencil=s; } //以上设定在Begin开始后即不可改变 diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index 58f361c3..86575147 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -141,7 +141,7 @@ public: //material相关 Texture2D *CreateAttachmentTextureDepth(const VkFormat video_format,uint32_t width,uint32_t height) { return CreateAttachmentTexture( video_format,width,height, - VK_IMAGE_ASPECT_DEPTH_BIT, + VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); } @@ -164,7 +164,7 @@ public: //material相关 public: //Command Buffer 相关 - CommandBuffer * CreateCommandBuffer(const VkExtent2D *extent=nullptr); + CommandBuffer * CreateCommandBuffer(const VkExtent2D *extent,const uint32_t atta_count); bool CreateAttachment( List &ref_list, List &desc_list, diff --git a/inc/hgl/graph/vulkan/VKImageView.h b/inc/hgl/graph/vulkan/VKImageView.h index b2350470..ae41c15b 100644 --- a/inc/hgl/graph/vulkan/VKImageView.h +++ b/inc/hgl/graph/vulkan/VKImageView.h @@ -14,17 +14,20 @@ protected: VkFormat format; VkImageAspectFlags aspect_mask; + VkExtent3D extent; + private: - friend ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img); + friend ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,const VkExtent3D &ext,VkImageAspectFlags aspectMask,VkImage img); - ImageView(VkDevice dev,VkImageView iv,const VkImageViewType vt,const VkFormat fmt,const VkImageAspectFlags am) + ImageView(VkDevice dev,VkImageView iv,const VkImageViewType vt,const VkFormat fmt,const VkExtent3D &ext,const VkImageAspectFlags am) { device =dev; image_view =iv; view_type =vt; format =fmt; aspect_mask =am; + extent =ext; } public: @@ -37,12 +40,13 @@ public: const VkImageViewType GetViewType ()const{return view_type;} const VkFormat GetFormat ()const{return format;} + const VkExtent3D & GetExtent ()const{return extent;} const VkImageAspectFlags GetAspectFlags ()const{return aspect_mask;} };//class ImageView -ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img); +ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,const VkExtent3D &ext,VkImageAspectFlags aspectMask,VkImage img); -#define CREATE_IMAGE_VIEW(short_name,larget_name) inline ImageView *CreateImageView##short_name(VkDevice device,VkFormat format,VkImageAspectFlags aspectMask,VkImage img=VK_NULL_HANDLE){return CreateImageView(device,VK_IMAGE_VIEW_TYPE_##larget_name,format,aspectMask,img);} +#define CREATE_IMAGE_VIEW(short_name,larget_name) inline ImageView *CreateImageView##short_name(VkDevice device,VkFormat format,const VkExtent3D &ext,VkImageAspectFlags aspectMask,VkImage img=VK_NULL_HANDLE){return CreateImageView(device,VK_IMAGE_VIEW_TYPE_##larget_name,format,ext,aspectMask,img);} CREATE_IMAGE_VIEW(1D,1D); CREATE_IMAGE_VIEW(2D,2D); CREATE_IMAGE_VIEW(3D,3D); diff --git a/res/shader/gbuffer_opaque.frag b/res/shader/gbuffer_opaque.frag index 534ac869..f3ae5a13 100644 --- a/res/shader/gbuffer_opaque.frag +++ b/res/shader/gbuffer_opaque.frag @@ -16,12 +16,15 @@ void main() { outPosition=vec4(FragmentPosition,1.0); - vec3 N = normalize(FragmentNormal); +/* vec3 N = normalize(FragmentNormal); + N.y=-N.y; vec3 T = normalize(FragmentTangent); vec3 B = cross(N,T); mat3 TBN = mat3(T,B,N); - vec3 tnorm = normalize(texture(TextureNormal,FragmentTexCoord).xyz*2.0-vec3(1.0))*TBN; + vec3 tnorm = normalize(texture(TextureNormal,FragmentTexCoord).xyz*2.0-vec3(1.0))*TBN;*/ - outNormal=vec4(tnorm,1.0); + //outNormal=vec4(tnorm,1.0); + + outNormal=vec4(FragmentNormal,1.0); outColor=texture(TextureColor,FragmentTexCoord); } diff --git a/res/shader/gbuffer_opaque.vert b/res/shader/gbuffer_opaque.vert index b3bc4e5c..84782de7 100644 --- a/res/shader/gbuffer_opaque.vert +++ b/res/shader/gbuffer_opaque.vert @@ -32,8 +32,12 @@ void main() FragmentPosition=pos.xyz; FragmentTexCoord=TexCoord; - mat3 n=inverse(mat3(pc.local_to_world)); +// mat3 n=inverse(mat3(pc.local_to_world)); - FragmentNormal=normalize(Normal)*n; - FragmentTangent=normalize(Tangent)*n; +// Normal.y=-Normal.y; +// FragmentNormal=normalize(Normal)*n; +// FragmentTangent=normalize(Tangent)*n; + + FragmentNormal=normalize((Normal+vec3(1.0))/2.0); + FragmentTangent=Tangent; } diff --git a/src/RenderDevice/Vulkan/VKCommandBuffer.cpp b/src/RenderDevice/Vulkan/VKCommandBuffer.cpp index 754659c2..09d5757f 100644 --- a/src/RenderDevice/Vulkan/VKCommandBuffer.cpp +++ b/src/RenderDevice/Vulkan/VKCommandBuffer.cpp @@ -8,18 +8,25 @@ #include VK_NAMESPACE_BEGIN -CommandBuffer::CommandBuffer(VkDevice dev,const VkExtent2D &extent,VkCommandPool cp,VkCommandBuffer cb) +CommandBuffer::CommandBuffer(VkDevice dev,const VkExtent2D &extent,const uint32_t atta_count,VkCommandPool cp,VkCommandBuffer cb) { device=dev; pool=cp; cmd_buf=cb; - clear_values[0].color.float32[0] = 0.2f; - clear_values[0].color.float32[1] = 0.2f; - clear_values[0].color.float32[2] = 0.2f; - clear_values[0].color.float32[3] = 0.2f; - clear_values[1].depthStencil.depth = 1.0f; - clear_values[1].depthStencil.stencil = 0; + cv_count=atta_count; + + if(cv_count>0) + { + clear_values=hgl_zero_new(cv_count); + + clear_values[cv_count-1].depthStencil.depth = 1.0f; + clear_values[cv_count-1].depthStencil.stencil = 0; + } + else + { + clear_values=nullptr; + } render_area.offset.x=0; render_area.offset.y=0; @@ -30,6 +37,8 @@ CommandBuffer::CommandBuffer(VkDevice dev,const VkExtent2D &extent,VkCommandPool CommandBuffer::~CommandBuffer() { + delete[] clear_values; + vkFreeCommandBuffers(device,pool,1,&cmd_buf); } @@ -57,7 +66,7 @@ bool CommandBuffer::BeginRenderPass(RenderPass *rp,Framebuffer *fb) rp_begin.renderPass = *rp; rp_begin.framebuffer = *fb; rp_begin.renderArea = render_area; - rp_begin.clearValueCount = 2; + rp_begin.clearValueCount = cv_count; rp_begin.pClearValues = clear_values; vkCmdBeginRenderPass(cmd_buf, &rp_begin, VK_SUBPASS_CONTENTS_INLINE); diff --git a/src/RenderDevice/Vulkan/VKDevice.cpp b/src/RenderDevice/Vulkan/VKDevice.cpp index b2e1fb80..51e50b00 100644 --- a/src/RenderDevice/Vulkan/VKDevice.cpp +++ b/src/RenderDevice/Vulkan/VKDevice.cpp @@ -85,7 +85,7 @@ void Device::RecreateDevice() fence_list.Add(this->CreateFence(true)); } - texture_cmd_buf=CreateCommandBuffer(); + texture_cmd_buf=CreateCommandBuffer(nullptr,0); current_frame=0; current_fence=0; @@ -100,7 +100,7 @@ bool Device::Resize(uint width,uint height) return(true); } -CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D *extent) +CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D *extent,const uint32_t atta_count) { if(!attr->cmd_pool) return(nullptr); @@ -119,7 +119,7 @@ CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D *extent) if(res!=VK_SUCCESS) return(nullptr); - return(new CommandBuffer(attr->device,extent?*extent:attr->swapchain_extent,attr->cmd_pool,cmd_buf)); + return(new CommandBuffer(attr->device,extent?*extent:attr->swapchain_extent,atta_count,attr->cmd_pool,cmd_buf)); } /** diff --git a/src/RenderDevice/Vulkan/VKDeviceCreater.cpp b/src/RenderDevice/Vulkan/VKDeviceCreater.cpp index cfba5d4a..74abc069 100644 --- a/src/RenderDevice/Vulkan/VKDeviceCreater.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceCreater.cpp @@ -139,14 +139,21 @@ namespace return(VK_NULL_HANDLE); } - ImageView *Create2DImageView(VkDevice device,VkFormat format,VkImage img=VK_NULL_HANDLE) + ImageView *Create2DImageView(VkDevice device,VkFormat format,const VkExtent2D &ext,VkImage img=VK_NULL_HANDLE) { - return CreateImageView(device,VK_IMAGE_VIEW_TYPE_2D,format,VK_IMAGE_ASPECT_COLOR_BIT,img); + VkExtent3D extent; + + copy(extent,ext); + + return CreateImageView(device,VK_IMAGE_VIEW_TYPE_2D,format,extent,VK_IMAGE_ASPECT_COLOR_BIT,img); } - ImageView *CreateDepthImageView(VkDevice device,VkFormat format,VkImage img=VK_NULL_HANDLE) + ImageView *CreateDepthImageView(VkDevice device,VkFormat format,const VkExtent2D &ext,VkImage img=VK_NULL_HANDLE) { - return CreateImageView(device,VK_IMAGE_VIEW_TYPE_2D,format,VK_IMAGE_ASPECT_DEPTH_BIT,img); + VkExtent3D extent; + + copy(extent,ext); + return CreateImageView(device,VK_IMAGE_VIEW_TYPE_2D,format,extent,VK_IMAGE_ASPECT_DEPTH_BIT,img); } bool CreateSwapchainTexture(DeviceAttribute *rsa) diff --git a/src/RenderDevice/Vulkan/VKFramebuffer.cpp b/src/RenderDevice/Vulkan/VKFramebuffer.cpp index 9f075e5f..991894d6 100644 --- a/src/RenderDevice/Vulkan/VKFramebuffer.cpp +++ b/src/RenderDevice/Vulkan/VKFramebuffer.cpp @@ -44,7 +44,7 @@ Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,ImageView **color_list attachments[color_count]=*depth; } - const VkExtent2D extent=dev->GetExtent(); + const VkExtent3D extent=depth->GetExtent(); VkFramebufferCreateInfo fb_info; fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; diff --git a/src/RenderDevice/Vulkan/VKImageView.cpp b/src/RenderDevice/Vulkan/VKImageView.cpp index fa309ce9..815ebf7b 100644 --- a/src/RenderDevice/Vulkan/VKImageView.cpp +++ b/src/RenderDevice/Vulkan/VKImageView.cpp @@ -6,7 +6,7 @@ ImageView::~ImageView() vkDestroyImageView(device,image_view,nullptr); } -ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img) +ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,const VkExtent3D &ext,VkImageAspectFlags aspectMask,VkImage img) { VkImageViewCreateInfo iv_createinfo={}; @@ -16,21 +16,32 @@ ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format, iv_createinfo.image=img; iv_createinfo.format=format; iv_createinfo.viewType=type; - iv_createinfo.components.r=VK_COMPONENT_SWIZZLE_R; - iv_createinfo.components.g=VK_COMPONENT_SWIZZLE_G; - iv_createinfo.components.b=VK_COMPONENT_SWIZZLE_B; - iv_createinfo.components.a=VK_COMPONENT_SWIZZLE_A; iv_createinfo.subresourceRange.aspectMask=aspectMask; iv_createinfo.subresourceRange.baseMipLevel=0; iv_createinfo.subresourceRange.levelCount=1; iv_createinfo.subresourceRange.baseArrayLayer=0; iv_createinfo.subresourceRange.layerCount=1; + if(aspectMask&VK_IMAGE_ASPECT_DEPTH_BIT) + { + iv_createinfo.components.r=VK_COMPONENT_SWIZZLE_IDENTITY; + iv_createinfo.components.g=VK_COMPONENT_SWIZZLE_IDENTITY; + iv_createinfo.components.b=VK_COMPONENT_SWIZZLE_IDENTITY; + iv_createinfo.components.a=VK_COMPONENT_SWIZZLE_IDENTITY; + } + else + { + iv_createinfo.components.r=VK_COMPONENT_SWIZZLE_R; + iv_createinfo.components.g=VK_COMPONENT_SWIZZLE_G; + iv_createinfo.components.b=VK_COMPONENT_SWIZZLE_B; + iv_createinfo.components.a=VK_COMPONENT_SWIZZLE_A; + } + VkImageView img_view; if(vkCreateImageView(device,&iv_createinfo,nullptr,&img_view)!=VK_SUCCESS) return(nullptr); - return(new ImageView(device,img_view,type,format,aspectMask)); + return(new ImageView(device,img_view,type,format,ext,aspectMask)); } VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/VKPipeline.cpp b/src/RenderDevice/Vulkan/VKPipeline.cpp index a85a616a..e9b0f878 100644 --- a/src/RenderDevice/Vulkan/VKPipeline.cpp +++ b/src/RenderDevice/Vulkan/VKPipeline.cpp @@ -132,6 +132,7 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,RenderPass depthStencilState.back.depthFailOp = VK_STENCIL_OP_KEEP; depthStencilState.back.writeMask = 0; depthStencilState.front = depthStencilState.back; + depthStencilState.front.compareOp=VK_COMPARE_OP_NEVER; pipelineInfo.pDepthStencilState=&depthStencilState; @@ -173,7 +174,7 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,RenderPass { pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; - pipelineInfo.basePipelineIndex = 0; + pipelineInfo.basePipelineIndex = -1; } } @@ -207,7 +208,7 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,RenderPass { pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; - pipelineInfo.basePipelineIndex = 0; + pipelineInfo.basePipelineIndex = -1; } } diff --git a/src/RenderDevice/Vulkan/VKTexture.cpp b/src/RenderDevice/Vulkan/VKTexture.cpp index 95c78d3d..3d843637 100644 --- a/src/RenderDevice/Vulkan/VKTexture.cpp +++ b/src/RenderDevice/Vulkan/VKTexture.cpp @@ -21,21 +21,21 @@ Texture::~Texture() Texture2D *CreateTexture2D(VkDevice device,VkFormat format,uint32_t width,uint32_t height,VkImageAspectFlagBits aspectMask,VkImage image,VkImageLayout image_layout) { TextureData *tex_data=new TextureData; + + tex_data->extent.width =width; + tex_data->extent.height =height; + tex_data->extent.depth =1; tex_data->memory =nullptr; tex_data->image =image; tex_data->image_layout =image_layout; - tex_data->image_view =CreateImageView(device,VK_IMAGE_VIEW_TYPE_2D,format,aspectMask,image); + tex_data->image_view =CreateImageView(device,VK_IMAGE_VIEW_TYPE_2D,format,tex_data->extent,aspectMask,image); tex_data->mip_levels =0; tex_data->linear =false; tex_data->format =format; tex_data->aspect =aspectMask; - tex_data->extent.width =width; - tex_data->extent.height =height; - tex_data->extent.depth =1; - return(new Texture2D(width,height,device,tex_data)); } @@ -77,7 +77,7 @@ Texture2D *CreateTexture2D(VkDevice device,const PhysicalDevice *pd,const VkForm if(dm&&dm->BindImage(image)) { - ImageView *image_view=CreateImageView2D(device,format,aspectMask,image); + ImageView *image_view=CreateImageView2D(device,format,imageCreateInfo.extent,aspectMask,image); if(image_view) {