ULRE/example/Vulkan/Cubemap.cpp

226 lines
5.7 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/VKRenderable.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;
2022-06-24 17:51:05 +08:00
Primitive * ro_axis =nullptr;
Primitive * ro_cube =nullptr;
Primitive * 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-03-09 20:33:26 +08:00
if(!sky_mi->BindSampler(DescriptorSetsType::Value,"tex" ,texture, sampler))return(false);
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-03-09 20:33:26 +08:00
if(!envmap_mi->BindSampler(DescriptorSetsType::Value,"EnvCubemap" ,texture, sampler))return(false);
2022-01-11 12:35:31 +08:00
solid_pipeline=CreatePipeline(envmap_mi,InlinePipeline::Solid3D,Prim::Triangles);
}
return(true);
}
void CreateRenderObject()
{
using namespace inline_geometry;
{
struct AxisCreateInfo aci;
2022-01-10 18:22:58 +08:00
aci.size=GetCameraInfo().zfar;
ro_axis=CreateAxis(db,axis_mi->GetVAB(),&aci);
}
2022-01-11 12:35:31 +08:00
{
struct CubeCreateInfo cci;
ro_cube=CreateCube(db,sky_mi->GetVAB(),&cci);
}
2022-01-07 21:16:44 +08:00
{
ro_sphere=CreateSphere(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-06-24 17:51:05 +08:00
SceneNode *Add(Primitive *r,MaterialInstance *mi,Pipeline *pl)
{
auto ri=db->CreateRenderable(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);
2022-01-26 11:20:49 +08:00
camera_control->SetTarget(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;
}