improve the OffscreenRender example.
This commit is contained in:
parent
7d856a5c79
commit
7f38492dcc
@ -1,55 +1,15 @@
|
|||||||
#include<hgl/graph/vulkan/VKRenderTarget.h>
|
#include<hgl/graph/vulkan/VKRenderTarget.h>
|
||||||
|
#include<hgl/graph/InlineGeometry.h>
|
||||||
#include"VulkanAppFramework.h"
|
#include"VulkanAppFramework.h"
|
||||||
|
|
||||||
using namespace hgl;
|
using namespace hgl;
|
||||||
using namespace hgl::graph;
|
using namespace hgl::graph;
|
||||||
|
|
||||||
constexpr uint OFFSCREEN_SIZE =64;
|
constexpr uint OFFSCREEN_SIZE =16;
|
||||||
constexpr uint SCREEN_WIDTH =1024;
|
constexpr uint SCREEN_WIDTH =1024;
|
||||||
constexpr uint SCREEN_HEIGHT =(SCREEN_WIDTH/16)*9;
|
constexpr uint SCREEN_HEIGHT =(SCREEN_WIDTH/16)*9;
|
||||||
|
|
||||||
constexpr uint32_t TRIANGLE_VERTEX_COUNT=3;
|
class TestApp:public CameraAppFramework
|
||||||
|
|
||||||
constexpr float triangle_vertex_data[TRIANGLE_VERTEX_COUNT][2]=
|
|
||||||
{
|
|
||||||
{OFFSCREEN_SIZE*0.5, OFFSCREEN_SIZE*0.25},
|
|
||||||
{OFFSCREEN_SIZE*0.75, OFFSCREEN_SIZE*0.75},
|
|
||||||
{OFFSCREEN_SIZE*0.25, OFFSCREEN_SIZE*0.75}
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr float triangle_color_data[TRIANGLE_VERTEX_COUNT][3]=
|
|
||||||
{ {1,0,0},
|
|
||||||
{0,1,0},
|
|
||||||
{0,0,1}
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr uint32_t RECT_VERTEX_COUNT=4;
|
|
||||||
|
|
||||||
constexpr float rect_vertex_data[RECT_VERTEX_COUNT][2]=
|
|
||||||
{
|
|
||||||
{0, 0},
|
|
||||||
{SCREEN_WIDTH, 0},
|
|
||||||
{0, SCREEN_HEIGHT},
|
|
||||||
{SCREEN_WIDTH, SCREEN_HEIGHT}
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr float rect_texcoord_data[RECT_VERTEX_COUNT][2]=
|
|
||||||
{
|
|
||||||
{0,0},
|
|
||||||
{1,0},
|
|
||||||
{0,1},
|
|
||||||
{1,1}
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr uint32_t RECT_INDEX_COUNT=6;
|
|
||||||
|
|
||||||
constexpr uint16 rect_index_data[RECT_INDEX_COUNT]=
|
|
||||||
{
|
|
||||||
0,1,3,
|
|
||||||
0,3,2
|
|
||||||
};
|
|
||||||
|
|
||||||
class TestApp:public VulkanApplicationFramework
|
|
||||||
{
|
{
|
||||||
struct RenderObject
|
struct RenderObject
|
||||||
{
|
{
|
||||||
@ -69,13 +29,14 @@ class TestApp:public VulkanApplicationFramework
|
|||||||
|
|
||||||
struct:public RenderObject
|
struct:public RenderObject
|
||||||
{
|
{
|
||||||
Camera cam;
|
|
||||||
|
|
||||||
vulkan::Sampler * sampler =nullptr;
|
vulkan::Sampler * sampler =nullptr;
|
||||||
|
|
||||||
vulkan::Pipeline * pipeline =nullptr;
|
vulkan::Pipeline * pipeline =nullptr;
|
||||||
vulkan::RenderableInstance *renderable_instance =nullptr;
|
vulkan::RenderableInstance *renderable_instance =nullptr;
|
||||||
}rect;
|
|
||||||
|
SceneNode scene_root;
|
||||||
|
RenderList render_list;
|
||||||
|
}cube;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -109,25 +70,31 @@ public:
|
|||||||
os.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
|
os.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
|
||||||
if(!os.material_instance)return(false);
|
if(!os.material_instance)return(false);
|
||||||
|
|
||||||
os.pipeline=db->CreatePipeline(os.material_instance,os.render_taget,vulkan::InlinePipeline::Solid2D);
|
os.pipeline=db->CreatePipeline(os.material_instance,os.render_taget,vulkan::InlinePipeline::Solid2D,Prim::Fan);
|
||||||
if(!os.pipeline)return(false);
|
if(!os.pipeline)return(false);
|
||||||
|
|
||||||
if(!InitUBO(&os,os.render_taget->GetExtent()))
|
if(!InitUBO(&os,os.render_taget->GetExtent()))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
{
|
{
|
||||||
vulkan::Renderable *render_obj=db->CreateRenderable(TRIANGLE_VERTEX_COUNT);
|
CircleCreateInfo cci;
|
||||||
if(!render_obj)return(false);
|
|
||||||
|
|
||||||
if(!render_obj->Set(VAN::Position, db->CreateVAB(VAF_VEC2,TRIANGLE_VERTEX_COUNT,triangle_vertex_data)))return(false);
|
cci.center.Set(OFFSCREEN_SIZE*0.5,OFFSCREEN_SIZE*0.5);
|
||||||
if(!render_obj->Set(VAN::Color, db->CreateVAB(VAF_VEC3,TRIANGLE_VERTEX_COUNT,triangle_color_data)))return(false);
|
cci.radius.Set(OFFSCREEN_SIZE*0.45,OFFSCREEN_SIZE*0.45);
|
||||||
|
cci.field_count=32;
|
||||||
|
cci.has_color=true;
|
||||||
|
cci.center_color.Set(1,1,1,1);
|
||||||
|
cci.border_color.Set(1,1,1,0);
|
||||||
|
|
||||||
|
vulkan::Renderable *render_obj=CreateRenderableCircle(db,os.material_instance->GetMaterial(),&cci);
|
||||||
|
if(!render_obj)return(false);
|
||||||
|
|
||||||
os.renderable_instance=db->CreateRenderableInstance(render_obj,os.material_instance,os.pipeline);
|
os.renderable_instance=db->CreateRenderableInstance(render_obj,os.material_instance,os.pipeline);
|
||||||
|
|
||||||
if(!os.renderable_instance)return(false);
|
if(!os.renderable_instance)return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildCommandBuffer(os.render_taget,os.renderable_instance);
|
VulkanApplicationFramework::BuildCommandBuffer(os.render_taget,os.renderable_instance);
|
||||||
|
|
||||||
os.render_taget->Submit(nullptr);
|
os.render_taget->Submit(nullptr);
|
||||||
os.render_taget->WaitQueue();
|
os.render_taget->WaitQueue();
|
||||||
@ -135,39 +102,43 @@ public:
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InitRectangle()
|
bool InitCube()
|
||||||
{
|
{
|
||||||
rect.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D"));
|
cube.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureMask3D"));
|
||||||
if(!rect.material_instance)return(false);
|
if(!cube.material_instance)return(false);
|
||||||
|
|
||||||
rect.pipeline=CreatePipeline(rect.material_instance,vulkan::InlinePipeline::Alpha2D);
|
cube.pipeline=CreatePipeline(cube.material_instance,vulkan::InlinePipeline::Solid3D);
|
||||||
if(!rect.pipeline)return(false);
|
if(!cube.pipeline)return(false);
|
||||||
|
|
||||||
rect.sampler=db->CreateSampler();
|
cube.sampler=db->CreateSampler();
|
||||||
rect.material_instance->BindSampler("tex",os.render_taget->GetColorTexture(),rect.sampler);
|
if(!cube.sampler)return(false);
|
||||||
|
|
||||||
if(!InitUBO(&rect,sc_render_target->GetExtent()))
|
cube.material_instance->BindSampler("tex",os.render_taget->GetColorTexture(),cube.sampler);
|
||||||
return(false);
|
cube.material_instance->BindUBO("world",GetCameraMatrixBuffer());
|
||||||
|
cube.material_instance->Update();
|
||||||
|
|
||||||
{
|
{
|
||||||
vulkan::Renderable *render_obj=db->CreateRenderable(RECT_VERTEX_COUNT);
|
CubeCreateInfo cci;
|
||||||
|
|
||||||
|
vulkan::Renderable *render_obj=CreateRenderableCube(db,cube.material_instance->GetMaterial(),&cci);
|
||||||
if(!render_obj)return(false);
|
if(!render_obj)return(false);
|
||||||
|
|
||||||
if(!render_obj->Set(VAN::Position,db->CreateVAB(VAF_VEC2,RECT_VERTEX_COUNT,rect_vertex_data)))return(false);
|
cube.renderable_instance=db->CreateRenderableInstance(render_obj,cube.material_instance,cube.pipeline);
|
||||||
if(!render_obj->Set(VAN::TexCoord,db->CreateVAB(VAF_VEC2,RECT_VERTEX_COUNT,rect_texcoord_data)))return(false);
|
|
||||||
if(!render_obj->Set(db->CreateIBO16(RECT_INDEX_COUNT,rect_index_data)))return(false);
|
|
||||||
|
|
||||||
rect.renderable_instance=db->CreateRenderableInstance(render_obj,rect.material_instance,rect.pipeline);
|
cube.scene_root.Add(cube.renderable_instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildCommandBuffer(rect.renderable_instance);
|
cube.scene_root.RefreshMatrix();
|
||||||
|
cube.scene_root.ExpendToList(&cube.render_list);
|
||||||
|
|
||||||
|
camera.eye.Set(5,5,5,1.0);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Init()
|
bool Init()
|
||||||
{
|
{
|
||||||
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
|
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
SetClearColor(COLOR::MozillaCharcoal);
|
SetClearColor(COLOR::MozillaCharcoal);
|
||||||
@ -175,24 +146,17 @@ public:
|
|||||||
if(!InitOffscreen())
|
if(!InitOffscreen())
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
if(!InitRectangle())
|
if(!InitCube())
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Resize(int w,int h)override
|
void BuildCommandBuffer(uint32 index)
|
||||||
{
|
{
|
||||||
rect.cam.width=w;
|
VulkanApplicationFramework::BuildCommandBuffer(index,&cube.render_list);
|
||||||
rect.cam.height=h;
|
|
||||||
|
|
||||||
rect.cam.Refresh();
|
|
||||||
|
|
||||||
rect.ubo_world_matrix->Write(&rect.cam.matrix);
|
|
||||||
|
|
||||||
BuildCommandBuffer(rect.renderable_instance);
|
|
||||||
}
|
}
|
||||||
};//class TestApp:public VulkanApplicationFramework
|
};//class TestApp:public CameraAppFramework
|
||||||
|
|
||||||
int main(int,char **)
|
int main(int,char **)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user