ULRE/example/Vulkan/Cubemap.cpp

243 lines
6.2 KiB
C++
Raw Normal View History

// Cubemap
// Cube贴图测试
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKRenderableInstance.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/RenderList.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
class TestApp:public CameraAppFramework
{
private:
SceneNode render_root;
RenderList * render_list =nullptr;
2022-01-11 12:35:31 +08:00
Material * sky_material =nullptr;
MaterialInstance * sky_mi =nullptr;
Material * axis_material =nullptr;
MaterialInstance * axis_mi =nullptr;
2022-01-11 12:35:31 +08:00
Material * envmap_material =nullptr;
MaterialInstance * envmap_mi =nullptr;
Pipeline * axis_pipeline =nullptr;
2022-01-07 21:16:44 +08:00
Pipeline * sky_pipeline =nullptr;
2022-01-11 12:35:31 +08:00
Pipeline * solid_pipeline =nullptr;
GPUBuffer * ubo_light =nullptr;
GPUBuffer * ubo_phong =nullptr;
Sampler * sampler =nullptr;
TextureCube * texture =nullptr;
Renderable * ro_axis =nullptr;
Renderable * ro_cube =nullptr;
2022-01-11 12:35:31 +08:00
Renderable * ro_sphere =nullptr;
private:
bool InitMaterial()
{
{
axis_material=db->CreateMaterial(OS_TEXT("res/material/VertexColor3D"));
if(!axis_material)return(false);
axis_mi=db->CreateMaterialInstance(axis_material);
if(!axis_mi)return(false);
axis_pipeline=CreatePipeline(axis_mi,InlinePipeline::Solid3D,Prim::Lines);
if(!axis_pipeline)return(false);
}
{
2022-01-11 12:35:31 +08:00
texture =db->LoadTextureCube(OS_TEXT("res/cubemap/Storforsen4.TexCube"),false);
if(!texture)
return(false);
VkSamplerCreateInfo sampler_create_info=
{
VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
nullptr,
0,
2022-01-11 12:35:31 +08:00
VK_FILTER_LINEAR,
VK_FILTER_LINEAR,
VK_SAMPLER_MIPMAP_MODE_LINEAR,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
0.0f,
VK_FALSE,
0,
false,
VK_COMPARE_OP_NEVER,
0.0f,
0,
VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK,
false
};
sampler =db->CreateSampler(&sampler_create_info);
}
{
2022-01-11 12:35:31 +08:00
sky_material=db->CreateMaterial(OS_TEXT("res/material/Skybox"));
if(!sky_material)return(false);
2022-01-11 12:35:31 +08:00
sky_mi=db->CreateMaterialInstance(sky_material);
if(!sky_mi)return(false);
{
2022-01-11 12:35:31 +08:00
MaterialParameters *mp_texture=sky_mi->GetMP(DescriptorSetsType::Value);
if(!mp_texture)
return(false);
if(!mp_texture->BindSampler("tex" ,texture, sampler))
return(false);
mp_texture->Update();
}
2022-01-11 12:35:31 +08:00
sky_pipeline=CreatePipeline(sky_mi,InlinePipeline::Sky,Prim::Triangles);
if(!sky_pipeline)return(false);
}
2022-01-11 12:35:31 +08:00
{
envmap_material=db->CreateMaterial(OS_TEXT("res/material/EnvCubemap"));
if(!envmap_material)return(false);
envmap_mi=db->CreateMaterialInstance(envmap_material);
if(!envmap_mi)return(false);
{
2022-01-11 12:35:31 +08:00
MaterialParameters *mp_texture=envmap_mi->GetMP(DescriptorSetsType::Value);
if(!mp_texture)
return(false);
if(!mp_texture->BindSampler("EnvCubemap" ,texture, sampler))
return(false);
mp_texture->Update();
}
solid_pipeline=CreatePipeline(envmap_mi,InlinePipeline::Solid3D,Prim::Triangles);
}
return(true);
}
void CreateRenderObject()
{
{
struct AxisCreateInfo aci;
2022-01-10 18:22:58 +08:00
aci.size=GetCameraInfo().zfar;
ro_axis=CreateRenderableAxis(db,axis_mi->GetVAB(),&aci);
}
2022-01-11 12:35:31 +08:00
{
struct CubeCreateInfo cci;
2022-01-11 12:35:31 +08:00
ro_cube=CreateRenderableCube(db,sky_mi->GetVAB(),&cci);
}
2022-01-07 21:16:44 +08:00
{
2022-01-11 12:35:31 +08:00
ro_sphere=CreateRenderableSphere(db,envmap_mi->GetVAB(),64);
2022-01-07 21:16:44 +08:00
}
}
2022-01-11 12:35:31 +08:00
bool InitUBO()
{
2022-01-11 12:35:31 +08:00
if(!BindCameraUBO(sky_mi))return(false);
if(!BindCameraUBO(envmap_mi))return(false);
2022-01-11 12:35:31 +08:00
return(true);
}
2022-01-11 12:35:31 +08:00
SceneNode *Add(Renderable *r,MaterialInstance *mi,Pipeline *pl)
{
2022-01-11 12:35:31 +08:00
auto ri=db->CreateRenderableInstance(r,mi,pl);
2022-01-11 12:35:31 +08:00
return render_root.CreateSubNode(ri);
}
bool InitScene()
{
2022-01-11 12:35:31 +08:00
Add(ro_axis,axis_mi,axis_pipeline);
Add(ro_cube,sky_mi,sky_pipeline);
Add(ro_sphere,envmap_mi,solid_pipeline)->SetLocalMatrix(scale(5,5,5));
render_root.RefreshMatrix();
render_list->Expend(GetCameraInfo(),&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(render_list);
}
bool Init()
{
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
camera->pos=Vector3f(10,10,0);
//camera->target=Vector3f(0,0,0);
//camera->Refresh(); //更新矩阵计算
2022-01-24 19:36:54 +08:00
render_list=new RenderList(device);
if(!InitMaterial())
return(false);
if(!InitUBO())
return(false);
CreateRenderObject();
if(!InitScene())
return(false);
return(true);
}
void BuildCommandBuffer(uint32_t index) override
{
render_root.RefreshMatrix();
render_list->Expend(GetCameraInfo(),&render_root);
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}