void SceneObjectCameraProxy::Init(CameraPtr const & camera, std::function<StaticMeshPtr(RenderModelPtr const &, std::wstring const &)> CreateMeshFactoryFunc) { RenderModelPtr camera_model = SyncLoadModel("camera_proxy.meshml", EAH_GPU_Read | EAH_Immutable, CreateModelFactory<RenderModel>(), CreateMeshFactoryFunc); this->Init(camera, camera_model); }
void SceneObjectLightSourceProxy::Init(LightSourcePtr const & light, std::function<StaticMeshPtr(RenderModelPtr const &, std::wstring const &)> CreateMeshFactoryFunc) { std::string mesh_name; switch (light->Type()) { case LightSource::LT_Ambient: mesh_name = "ambient_light_proxy.meshml"; break; case LightSource::LT_Point: case LightSource::LT_SphereArea: mesh_name = "point_light_proxy.meshml"; break; case LightSource::LT_Directional: case LightSource::LT_Sun: mesh_name = "directional_light_proxy.meshml"; break; case LightSource::LT_Spot: mesh_name = "spot_light_proxy.meshml"; break; case LightSource::LT_TubeArea: mesh_name = "tube_light_proxy.meshml"; break; default: BOOST_ASSERT(false); break; } RenderModelPtr light_model = SyncLoadModel(mesh_name.c_str(), EAH_GPU_Read | EAH_Immutable, CreateModelFactory<RenderModel>(), CreateMeshFactoryFunc); this->Init(light, light_model); }
MultiResSILLayer::MultiResSILLayer() { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEngine& re = rf.RenderEngineInstance(); RenderDeviceCaps const & caps = re.DeviceCaps(); { rl_quad_ = rf.MakeRenderLayout(); rl_quad_->TopologyType(RenderLayout::TT_TriangleStrip); std::vector<float3> pos; std::vector<uint16_t> index; pos.push_back(float3(+1, +1, 1)); pos.push_back(float3(-1, +1, 1)); pos.push_back(float3(+1, -1, 1)); pos.push_back(float3(-1, -1, 1)); ElementInitData init_data; init_data.row_pitch = static_cast<uint32_t>(pos.size() * sizeof(pos[0])); init_data.slice_pitch = 0; init_data.data = &pos[0]; rl_quad_->BindVertexStream(rf.MakeVertexBuffer(BU_Static, EAH_GPU_Read | EAH_Immutable, &init_data), make_tuple(vertex_element(VEU_Position, 0, EF_BGR32F))); } vpl_tex_ = rf.MakeTexture2D(VPL_COUNT, 4, 1, 1, EF_ABGR16F, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); gbuffer_to_depth_derivate_pp_ = SyncLoadPostProcess("MultiRes.ppml", "GBuffer2DepthDerivate"); depth_derivate_mipmap_pp_ = SyncLoadPostProcess("MultiRes.ppml", "DepthDerivateMipMap"); gbuffer_to_normal_cone_pp_ = SyncLoadPostProcess("MultiRes.ppml", "GBuffer2NormalCone"); normal_cone_mipmap_pp_ = SyncLoadPostProcess("MultiRes.ppml", "NormalConeMipMap"); RenderEffectPtr subsplat_stencil_effect = SyncLoadRenderEffect("MultiRes.fxml"); subsplat_stencil_tech_ = subsplat_stencil_effect->TechniqueByName("SetSubsplatStencil"); subsplat_cur_lower_level_param_ = subsplat_stencil_effect->ParameterByName("cur_lower_level"); subsplat_is_not_first_last_level_param_ = subsplat_stencil_effect->ParameterByName("is_not_first_last_level"); subsplat_depth_deriv_tex_param_ = subsplat_stencil_effect->ParameterByName("depth_deriv_tex"); subsplat_normal_cone_tex_param_ = subsplat_stencil_effect->ParameterByName("normal_cone_tex"); subsplat_depth_normal_threshold_param_ = subsplat_stencil_effect->ParameterByName("depth_normal_threshold"); RenderEffectPtr vpls_lighting_effect = SyncLoadRenderEffect("VPLsLighting.fxml"); vpls_lighting_instance_id_tech_ = vpls_lighting_effect->TechniqueByName("VPLsLightingInstanceID"); vpls_lighting_no_instance_id_tech_ = vpls_lighting_effect->TechniqueByName("VPLsLightingNoInstanceID"); vpl_view_param_ = vpls_lighting_effect->ParameterByName("view"); vpl_proj_param_ = vpls_lighting_effect->ParameterByName("proj"); vpl_depth_near_far_invfar_param_ = vpls_lighting_effect->ParameterByName("depth_near_far_invfar"); vpl_light_pos_es_param_ = vpls_lighting_effect->ParameterByName("light_pos_es"); vpl_light_color_param_ = vpls_lighting_effect->ParameterByName("light_color"); vpl_light_falloff_param_ = vpls_lighting_effect->ParameterByName("light_falloff"); vpl_x_coord_param_ = vpls_lighting_effect->ParameterByName("x_coord"); vpl_gbuffer_tex_param_ = vpls_lighting_effect->ParameterByName("gbuffer_tex"); vpl_depth_tex_param_ = vpls_lighting_effect->ParameterByName("depth_tex"); *(vpls_lighting_effect->ParameterByName("vpls_tex")) = vpl_tex_; *(vpls_lighting_effect->ParameterByName("vpl_params")) = float2(1.0f / VPL_COUNT, 0.5f / VPL_COUNT); upsampling_pp_ = SyncLoadPostProcess("MultiRes.ppml", "Upsampling"); rl_vpl_ = SyncLoadModel("indirect_light_proxy.meshml", EAH_GPU_Read | EAH_Immutable, CreateModelFactory<RenderModel>(), CreateMeshFactory<StaticMesh>())->Mesh(0)->GetRenderLayout(); if (caps.instance_id_support) { rl_vpl_->NumInstances(VPL_COUNT); } }