to improve create program, that are RenderPass and Framebuffer

This commit is contained in:
2020-10-15 22:13:15 +08:00
parent c960731c28
commit 1e0676c6c7
21 changed files with 348 additions and 183 deletions

View File

@@ -1,6 +1,3 @@
// 0.triangle
// 该范例主要演示直接绘制一个渐变色的三角形
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>

View File

@@ -42,17 +42,11 @@ CreateProject(13.DrawTile DrawTile.cpp)
CreateProject(14.DrawText DrawText.cpp)
IF(SUPPORT_QT_VULKAN)
include(QtCommon)
CreateQtProject(14.VulkanQT VulkanQtApp.cpp
QtVulkanWindow.cpp
QtVulkanWindow.h
QtVulkanMainWindow.h
QtVulkanMainWindow.cpp)
ENDIF(SUPPORT_QT_VULKAN)
CreateProject(15.OffscreenRender OffscreenRender.cpp)
#CreateProject(12.PBRBasic PBRBasic.cpp)
#CreateProject(12.Deferred Deferred.cpp)
#CreateProject(13.DeferredModel DeferredModel.cpp)
CreateProject(16.DeferredModel DeferredModel.cpp)
#CreateProject(14.AutoMaterial auto_material.cpp)

View File

@@ -4,8 +4,8 @@
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneDB.h>
#include<hgl/graph/RenderableInstance.h>
#include<hgl/graph/vulkan/VKDatabase.h>
#include<hgl/graph/vulkan/VKRenderableInstance.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/vulkan/VKTexture.h>
#include<hgl/graph/vulkan/VKImageView.h>
@@ -70,7 +70,7 @@ private:
struct
{
List<VkAttachmentDescription> desc_list;
List<VkAttachmentReference> color_ref_list;
VkAttachmentReference *color_ref_list;
VkAttachmentReference depth_ref;
}attachment;
@@ -187,23 +187,21 @@ private:
gbuffer.image_view_list.Add(gbuffer.texture_list[i]->GetImageView());
}
device->CreateColorAttachmentReference(gbuffer.attachment.color_ref_list,0,3);
device->CreateDepthAttachmentReference(&gbuffer.attachment.depth_ref,3);
gbuffer.attachment.color_ref_list=new VkAttachmentReference[3];
if(!device->CreateAttachment( gbuffer.attachment.desc_list,
gbuffer.gbuffer_format_list,
gbuffer.depth->GetFormat()))
vulkan::CreateColorAttachmentReference(gbuffer.attachment.color_ref_list,3);
vulkan::CreateDepthAttachmentReference(&gbuffer.attachment.depth_ref);
if(!vulkan::CreateAttachment( gbuffer.attachment.desc_list,
gbuffer.gbuffer_format_list,
gbuffer.depth->GetFormat()))
return(false);
VkSubpassDescription desc;
device->CreateSubpassDescription(desc,
gbuffer.attachment.color_ref_list,
&gbuffer.attachment.depth_ref);
vulkan::SubpassDescription desc(gbuffer.attachment.color_ref_list,3,&gbuffer.attachment.depth_ref);
gbuffer.subpass.desc.Add(desc);
device->CreateSubpassDependency(gbuffer.subpass.dependency,2); //为啥要2个还不清楚
vulkan::CreateSubpassDependency(gbuffer.subpass.dependency,2); //为啥要2个还不清楚
gbuffer.renderpass=device->CreateRenderPass(gbuffer.attachment.desc_list,
gbuffer.subpass.desc,
@@ -214,7 +212,7 @@ private:
if(!gbuffer.renderpass)
return(false);
gbuffer.framebuffer=vulkan::CreateFramebuffer(device,gbuffer.renderpass,gbuffer.image_view_list,gbuffer.depth->GetImageView());
gbuffer.framebuffer=vulkan::CreateFramebuffer(device->GetDevice(),gbuffer.renderpass,gbuffer.image_view_list,gbuffer.depth->GetImageView());
if(!gbuffer.framebuffer)
return(false);
@@ -226,15 +224,12 @@ private:
bool InitSubpass(SubpassParam *sp,const OSString &vs,const OSString &fs)
{
sp->material=shader_manage->CreateMaterial(vs,fs);
sp->material=db->CreateMaterial(vs,fs);
if(!sp->material)
return(false);
sp->material_instance=sp->material->CreateInstance();
db->Add(sp->material);
db->Add(sp->material_instance);
sp->material_instance=db->CreateMaterialInstance(sp->material);
return(true);
}

View File

@@ -0,0 +1,48 @@
#include<hgl/graph/vulkan/VKRenderTarget.h>
#include"VulkanAppFramework.h"
using namespace hgl;
using namespace hgl::graph;
constexpr uint OFFSCREEN_SIZE =512;
constexpr uint SCREEN_WIDTH =1024;
constexpr uint SCREEN_HEIGHT =(SCREEN_WIDTH/16)*9;
class OffscreenRender:public VulkanApplicationFramework
{
vulkan::RenderTarget *os_rt;
public:
~OffscreenRender()
{
}
bool InitOffscreenRT()
{
os_rt=vulkan::CreateColorFramebuffer(
}
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitOffscreenRT())
return(false);
return(true);
}
};//class OffscreenRender:public VulkanApplicationFramework
int main(int,char **)
{
OffscreenRender app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}