修正诸多问题,MRT输出基本成功,但depth test失败,问题未知

This commit is contained in:
hyzboy 2019-07-10 21:00:36 +08:00
parent 5b4dad6941
commit b7954338aa
15 changed files with 120 additions and 62 deletions

View File

@ -219,7 +219,8 @@ private:
AutoDelete<vulkan::PipelineCreater> 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);

View File

@ -137,10 +137,12 @@ public:
swap_chain_count=device->GetSwapChainImageCount();
{
const VkExtent2D extent=device->GetExtent();
cmd_buf=hgl_zero_new<vulkan::CommandBuffer *>(swap_chain_count);
for(uint i=0;i<swap_chain_count;i++)
cmd_buf[i]=device->CreateCommandBuffer();
cmd_buf[i]=device->CreateCommandBuffer(&extent,2);
}
}

View File

@ -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

View File

@ -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开始后即不可改变

View File

@ -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<VkAttachmentReference> &ref_list,
List<VkAttachmentDescription> &desc_list,

View File

@ -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);

View File

@ -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);
}

View File

@ -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;
}

View File

@ -8,18 +8,25 @@
#include<hgl/graph/vulkan/VKDescriptorSets.h>
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<VkClearValue>(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);

View File

@ -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));
}
/**

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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;
}
}

View File

@ -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)
{