bool Particle_renderer::init(Resource_manager& resource_manager, Constant_buffer_cache& constant_buffer_cache) { Flags<Effect_provider::Options, uint32_t> flags; flags.set(Effect_provider::Options::Use_custom_constant_buffers, true); effect_ = resource_manager.load<Effect>("Effects/Particle_rendering/Particle_renderer.effect", flags.data()); if (!effect_) { return false; } techniques_.color_map = effect_->technique("Color_map"); techniques_.color_map_soft = effect_->technique("Color_map_soft"); techniques_.array_color_map = effect_->technique("Array_color_map"); techniques_.array_color_map_soft = effect_->technique("Array_color_map_soft"); lighting_techniques_.color_map_soft = effect_->technique("Lighting_color_map_soft"); Vertex_layout_description::Element elements[] = { Vertex_layout_description::Element("Position", 0, Data_format::R32G32B32A32_Float), Vertex_layout_description::Element("Properties", 0, Data_format::R32G32B32A32_Float) }; static const Vertex_layout_description description(2, elements); input_layout_ = rendering_tool_.vertex_layout_cache().input_layout(description, techniques_.color_map->program()->signature()); if (!input_layout_) { return false; } color_texture_offset_ = effect_->sampler_offset("g_color_map"); color_texture_array_offset_ = effect_->sampler_offset("g_color_map_array"); irradiance_volume_texture_offset_ = effect_->sampler_offset("g_irradiance_volume_map0"); auto& device = rendering_tool_.device(); Constant_buffer_adapter* change_per_camera_adapter = effect_->constant_buffer_adapter("Change_per_camera"); if (!constant_buffer_cache.connect(change_per_camera_adapter, "Change_per_camera")) { return false; } Constant_buffer_adapter* change_per_light_adapter = effect_->constant_buffer_adapter("Change_per_light"); if (!constant_buffer_cache.connect(change_per_light_adapter, "Change_per_light")) { return false; } if (!change_per_light_.init(change_per_light_adapter)) { return false; } effect_->create_default_constant_buffers(device); if (!create_buffers()) { return false; } return create_render_states(); }
bool Directional_shadow_renderer_EVSM_MS::init(Resource_manager& resource_manager, Constant_buffer_cache& constant_buffer_cache) { auto& device = rendering_tool_.device(); Texture_description texture_description; texture_description.type = Texture_description::Type::Texture_2D; texture_description.format = Data_format::R32G32B32A32_Float; texture_description.dimensions.xy = shadow_map_dimensions_; texture_description.num_samples = 0; texture_description.shader_resource = true; shadow_map_ = device.create_render_target_shader_resource_view(texture_description); if (!shadow_map_) { return false; } if (!Shadow_renderer_EVSM_MS::init(shadow_map_dimensions_, rendering_tool_, resource_manager, constant_buffer_cache)) { return false; } apply_shadow_.framebuffer = rendering_tool_.device().create_framebuffer(); if (!apply_shadow_.framebuffer) { return false; } Flags<Effect_provider::Options, uint32_t> flags; flags.set(Effect_provider::Options::Use_custom_constant_buffers, true); apply_shadow_.effect = resource_manager.load<Effect>("Effects/Shadowing/Apply_shadow_map_EVSM.effect", flags.data()); if (!apply_shadow_.effect) { return false; } apply_shadow_.technique = apply_shadow_.effect->technique("Apply_shadow_map"); apply_shadow_.volume_technique = apply_shadow_.effect->technique("Apply_shadow_map_volume"); apply_shadow_.input_layout = rendering_tool_.vertex_layout_cache().input_layout(*Vertex_position2x32_tex_coord2x32::vertex_layout_description(), apply_shadow_.technique->program()->signature()); if (!apply_shadow_.input_layout) { return false; } apply_shadow_.volume_input_layout = rendering_tool_.vertex_layout_cache().input_layout(*Vertex_position3x32::vertex_layout_description(), apply_shadow_.volume_technique->program()->signature()); if (!apply_shadow_.volume_input_layout) { return false; } if (!apply_shadow_.filter_kernel.init(apply_shadow_.effect, "Filter_kernel")) { return false; } Constant_buffer_adapter* change_per_camera_adapter = apply_shadow_.effect->constant_buffer_adapter("Change_per_camera"); if (!change_per_camera_adapter) { return false; } Handle<Constant_buffer> change_per_camera_buffer = constant_buffer_cache.constant_buffer("Change_per_camera"); if (!change_per_camera_buffer) { return false; } change_per_camera_adapter->set_constant_buffer(change_per_camera_buffer); if (!apply_shadow_.change_per_cascade.init(apply_shadow_.effect, "Change_per_cascade")) { return false; } apply_shadow_.effect->create_default_constant_buffers(device); if (!volume_.init(rendering_tool_)) { return false; } for (uint32_t i = 0; i < filter_kernel_size_; ++i) { apply_shadow_.filter_kernel.data().filter_kernel[i] = filter_kernel_[i]; } apply_shadow_.filter_kernel.update(device); return create_render_states(); }
bool Deferred_lighting_renderer::init(Resource_manager& resource_manager, Constant_buffer_cache& constant_buffer_cache) { Flags<Effect_provider::Options, uint32_t> flags; flags.set(Effect_provider::Options::Use_custom_constant_buffers, true); effect_ = resource_manager.load<Effect>("Effects/Lighting/Deferred_lighting_renderer.effect", flags.data()); if (!effect_) { return false; } techniques_.emissive_light = effect_->technique("Emissive_light"); techniques_.irradiance_volume = effect_->technique("Irradiance_volume"); techniques_.light_probe_specular = effect_->technique("Light_probe_specular"); techniques_.volume_light_probe_specular = effect_->technique("Volume_light_probe_specular"); techniques_.directional_light = effect_->technique("Directional_light"); techniques_.directional_light_with_shadow = effect_->technique("Directional_light_with_shadow"); techniques_.point_light = effect_->technique("Point_light"); techniques_.spot_light = effect_->technique("Spot_light"); techniques_.spot_light_with_shadow = effect_->technique("Spot_light_with_shadow"); input_layout_ = rendering_tool_.vertex_layout_cache().input_layout(*Vertex_position2x32_tex_coord2x32::vertex_layout_description(), techniques_.directional_light->program()->signature()); if (!input_layout_) { return false; } Constant_buffer_adapter* change_per_camera_adapter = effect_->constant_buffer_adapter("Change_per_camera"); if (!constant_buffer_cache.connect(change_per_camera_adapter, "Change_per_camera")) { return false; } if (!filter_kernel_.init(effect_, "Filter_kernel")) { return false; } if (!change_per_light_.init(effect_, "Change_per_light")) { return false; } auto& device = rendering_tool_.device(); Constant_buffer_adapter* change_per_light_adapter = change_per_light_.adapter(); Handle<Constant_buffer> change_per_light_buffer = device.create_constant_buffer(change_per_light_adapter->num_bytes()); change_per_light_adapter->set_constant_buffer(change_per_light_buffer); constant_buffer_cache.set_constant_buffer("Change_per_light", change_per_light_buffer); effect_->create_default_constant_buffers(device); volume_input_layout_ = rendering_tool_.vertex_layout_cache().input_layout(*Vertex_position3x32::vertex_layout_description(), techniques_.point_light->program()->signature()); if (!volume_input_layout_) { return false; } light_2D_texture_offset0_ = effect_->sampler_offset("g_light_2D_map0"); light_2D_texture_offset1_ = effect_->sampler_offset("g_light_2D_map1"); light_probe_texture_offset_ = effect_->sampler_offset("g_light_probe_map"); irradiance_volume_texture_offset_ = effect_->sampler_offset("g_irradiance_volume_map0"); if (!box_volume_.init(rendering_tool_)) { return false; } if (!sphere_volume_.init(rendering_tool_)) { return false; } if (!frustum_volume_.init(rendering_tool_)) { return false; } if (!directional_shadow_renderer_.init(resource_manager, constant_buffer_cache)) { logging::error("Directional shadow renderer could not be initialized."); return false; } if (!spot_shadow_renderer_.init(resource_manager, constant_buffer_cache)) { logging::error("Spot shadow renderer could not be initialized."); return false; } for (uint32_t i = 0, count = spot_shadow_renderer_.filter_kernel_size(); i < count; ++i) { filter_kernel_.data().filter_kernel[i] = spot_shadow_renderer_.filter_kernel()[i]; } filter_kernel_.update(device); return create_render_states(); }