void RenderableTriangle::Init() { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEffectPtr effect = SyncLoadRenderEffect("RenderableHelper.fxml"); technique_ = simple_forward_tech_ = effect->TechniqueByName("LineTec"); v0_ep_ = effect->ParameterByName("v0"); v1_ep_ = effect->ParameterByName("v1"); v2_ep_ = effect->ParameterByName("v2"); color_ep_ = effect->ParameterByName("color"); mvp_param_ = effect->ParameterByName("mvp"); float vertices[] = { 0, 1, 2 }; ElementInitData init_data; init_data.row_pitch = sizeof(vertices); init_data.slice_pitch = 0; init_data.data = vertices; rl_ = rf.MakeRenderLayout(); rl_->TopologyType(RenderLayout::TT_TriangleList); GraphicsBufferPtr vb = rf.MakeVertexBuffer(BU_Static, EAH_GPU_Read | EAH_Immutable, &init_data); rl_->BindVertexStream(vb, make_tuple(vertex_element(VEU_Position, 0, EF_R32F))); tc_aabb_ = AABBox(float3(0, 0, 0), float3(0, 0, 0)); *(effect->ParameterByName("pos_center")) = float3(0, 0, 0); *(effect->ParameterByName("pos_extent")) = float3(1, 1, 1); effect_attrs_ |= EA_SimpleForward; }
SSRPostProcess::SSRPostProcess() : PostProcess(L"ScreenSpaceReflection") { input_pins_.push_back(std::make_pair("g_buffer_0_tex", TexturePtr())); input_pins_.push_back(std::make_pair("g_buffer_1_tex", TexturePtr())); input_pins_.push_back(std::make_pair("front_side_depth_tex", TexturePtr())); input_pins_.push_back(std::make_pair("front_side_tex", TexturePtr())); input_pins_.push_back(std::make_pair("foreground_depth_tex", TexturePtr())); params_.push_back(std::make_pair("min_samples", RenderEffectParameterPtr())); params_.push_back(std::make_pair("max_samples", RenderEffectParameterPtr())); RenderEffectPtr effect = SyncLoadRenderEffect("SSR.fxml"); this->Technique(effect->TechniqueByName("ScreenSpaceReflectionPostProcess")); if (technique_ && technique_->Validate()) { proj_param_ = effect->ParameterByName("proj"); inv_proj_param_ = effect->ParameterByName("inv_proj"); near_q_far_param_ = effect->ParameterByName("near_q_far"); ray_length_param_ = effect->ParameterByName("ray_length"); } this->SetParam(0, static_cast<int32_t>(20)); this->SetParam(1, static_cast<int32_t>(30)); }
SSSBlurPP::SSSBlurPP() : PostProcess(L"SSSBlurPP") { RenderDeviceCaps const & caps = Context::Instance().RenderFactoryInstance().RenderEngineInstance().DeviceCaps(); mrt_blend_support_ = (caps.max_simultaneous_rts > 1) && caps.independent_blend_support; input_pins_.emplace_back("src_tex", TexturePtr()); input_pins_.emplace_back("depth_tex", TexturePtr()); output_pins_.emplace_back("output", TexturePtr()); params_.emplace_back("strength", nullptr); params_.emplace_back("correction", nullptr); RenderEffectPtr effect = SyncLoadRenderEffect("SSS.fxml"); copy_tech_ = effect->TechniqueByName("Copy"); blur_x_tech_ = effect->TechniqueByName("BlurX"); if (mrt_blend_support_) { std::string blur_y_name = "BlurY1"; for (uint32_t i = 0; i < 3; ++ i) { blur_y_name[5] = static_cast<char>('1' + i); blur_y_techs_[i] = effect->TechniqueByName(blur_y_name); } } else { blur_y_techs_[0] = blur_x_tech_; std::string accum_name = "Accum1"; for (uint32_t i = 0; i < 3; ++ i) { accum_name[5] = static_cast<char>('1' + i); accum_techs_[i] = effect->TechniqueByName(accum_name); } } this->Technique(effect, blur_x_tech_); RenderFactory& rf = Context::Instance().RenderFactoryInstance(); blur_x_fb_ = rf.MakeFrameBuffer(); blur_y_fb_ = rf.MakeFrameBuffer(); src_tex_param_ = effect->ParameterByName("src_tex"); step_param_ = effect->ParameterByName("step"); far_plane_param_ = effect->ParameterByName("far_plane"); }
RenderableSkyBox::RenderableSkyBox() : RenderableHelper(L"SkyBox") { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEffectPtr effect = SyncLoadRenderEffect("SkyBox.fxml"); if (deferred_effect_) { this->BindDeferredEffect(effect); depth_tech_ = effect->TechniqueByName("DepthSkyBoxTech"); gbuffer_rt0_tech_ = effect->TechniqueByName("GBufferSkyBoxRT0Tech"); gbuffer_rt1_tech_ = effect->TechniqueByName("GBufferSkyBoxRT1Tech"); gbuffer_mrt_tech_ = effect->TechniqueByName("GBufferSkyBoxMRTTech"); special_shading_tech_ = effect->TechniqueByName("SkyBoxTech"); this->Technique(gbuffer_rt0_tech_); effect_attrs_ |= EA_SpecialShading; } else { this->Technique(effect->TechniqueByName("SkyBoxTech")); } float3 xyzs[] = { float3(1.0f, 1.0f, 1.0f), float3(1.0f, -1.0f, 1.0f), float3(-1.0f, 1.0f, 1.0f), float3(-1.0f, -1.0f, 1.0f), }; ElementInitData init_data; init_data.row_pitch = sizeof(xyzs); init_data.slice_pitch = 0; init_data.data = xyzs; rl_ = rf.MakeRenderLayout(); rl_->TopologyType(RenderLayout::TT_TriangleStrip); GraphicsBufferPtr vb = rf.MakeVertexBuffer(BU_Static, EAH_GPU_Read | EAH_Immutable, &init_data); rl_->BindVertexStream(vb, make_tuple(vertex_element(VEU_Position, 0, EF_BGR32F))); pos_aabb_ = MathLib::compute_aabbox(&xyzs[0], &xyzs[4]); tc_aabb_ = AABBox(float3(0, 0, 0), float3(0, 0, 0)); }
void RenderableLineBox::Init() { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEffectPtr effect = SyncLoadRenderEffect("RenderableHelper.fxml"); technique_ = simple_forward_tech_ = effect->TechniqueByName("LineTec"); v0_ep_ = effect->ParameterByName("v0"); v1_ep_ = effect->ParameterByName("v1"); v2_ep_ = effect->ParameterByName("v2"); v3_ep_ = effect->ParameterByName("v3"); v4_ep_ = effect->ParameterByName("v4"); v5_ep_ = effect->ParameterByName("v5"); v6_ep_ = effect->ParameterByName("v6"); v7_ep_ = effect->ParameterByName("v7"); color_ep_ = effect->ParameterByName("color"); mvp_param_ = effect->ParameterByName("mvp"); float vertices[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; uint16_t indices[] = { 0, 1, 1, 3, 3, 2, 2, 0, 4, 5, 5, 7, 7, 6, 6, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; rl_ = rf.MakeRenderLayout(); rl_->TopologyType(RenderLayout::TT_LineList); ElementInitData init_data; init_data.row_pitch = sizeof(vertices); init_data.slice_pitch = 0; init_data.data = vertices; GraphicsBufferPtr vb = rf.MakeVertexBuffer(BU_Static, EAH_GPU_Read | EAH_Immutable, &init_data); rl_->BindVertexStream(vb, std::make_tuple(vertex_element(VEU_Position, 0, EF_R32F))); init_data.row_pitch = sizeof(indices); init_data.slice_pitch = 0; init_data.data = indices; GraphicsBufferPtr ib = rf.MakeIndexBuffer(BU_Static, EAH_GPU_Read | EAH_Immutable, &init_data); rl_->BindIndexStream(ib, EF_R16UI); tc_aabb_ = AABBox(float3(0, 0, 0), float3(0, 0, 0)); *(effect->ParameterByName("pos_center")) = float3(0, 0, 0); *(effect->ParameterByName("pos_extent")) = float3(1, 1, 1); effect_attrs_ |= EA_SimpleForward; }
SDSMCascadedShadowLayer::SDSMCascadedShadowLayer() : frame_index_(0) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderDeviceCaps const & caps = rf.RenderEngineInstance().DeviceCaps(); cs_support_ = caps.cs_support && (caps.max_shader_model >= ShaderModel(5, 0)); if (cs_support_) { interval_buff_ = rf.MakeVertexBuffer(BU_Dynamic, EAH_GPU_Read | EAH_GPU_Write | EAH_GPU_Unordered | EAH_GPU_Structured, nullptr, EF_GR32F); scale_buff_ = rf.MakeVertexBuffer(BU_Dynamic, EAH_GPU_Write | EAH_GPU_Unordered | EAH_GPU_Structured, nullptr, EF_BGR32F); bias_buff_ = rf.MakeVertexBuffer(BU_Dynamic, EAH_GPU_Write | EAH_GPU_Unordered | EAH_GPU_Structured, nullptr, EF_BGR32F); cascade_min_buff_ = rf.MakeVertexBuffer(BU_Dynamic, EAH_GPU_Read | EAH_GPU_Write | EAH_GPU_Unordered | EAH_GPU_Structured, nullptr, EF_BGR32F); cascade_max_buff_ = rf.MakeVertexBuffer(BU_Dynamic, EAH_GPU_Read | EAH_GPU_Write | EAH_GPU_Unordered | EAH_GPU_Structured, nullptr, EF_BGR32F); interval_buff_->Resize(MAX_NUM_CASCADES * sizeof(float2)); scale_buff_->Resize(MAX_NUM_CASCADES * sizeof(float3)); bias_buff_->Resize(MAX_NUM_CASCADES * sizeof(float3)); cascade_min_buff_->Resize(MAX_NUM_CASCADES * sizeof(float3)); cascade_max_buff_->Resize(MAX_NUM_CASCADES * sizeof(float3)); for (uint32_t i = 0; i < 2; ++ i) { interval_cpu_buffs_[i] = rf.MakeVertexBuffer(BU_Dynamic, EAH_CPU_Read, nullptr); scale_cpu_buffs_[i] = rf.MakeVertexBuffer(BU_Dynamic, EAH_CPU_Read, nullptr); bias_cpu_buffs_[i] = rf.MakeVertexBuffer(BU_Dynamic, EAH_CPU_Read, nullptr); interval_cpu_buffs_[i]->Resize(interval_buff_->Size()); scale_cpu_buffs_[i]->Resize(scale_buff_->Size()); bias_cpu_buffs_[i]->Resize(bias_buff_->Size()); } RenderEffectPtr effect = SyncLoadRenderEffect("CascadedShadow.fxml"); clear_z_bounds_tech_ = effect->TechniqueByName("ClearZBounds"); reduce_z_bounds_from_depth_tech_ = effect->TechniqueByName("ReduceZBoundsFromDepth"); compute_log_cascades_from_z_bounds_tech_ = effect->TechniqueByName("ComputeLogCascadesFromZBounds"); clear_cascade_bounds_tech_ = effect->TechniqueByName("ClearCascadeBounds"); reduce_bounds_from_depth_tech_ = effect->TechniqueByName("ReduceBoundsFromDepth"); compute_custom_cascades_tech_ = effect->TechniqueByName("ComputeCustomCascades"); interval_buff_param_ = effect->ParameterByName("interval_buff"); interval_buff_uint_param_ = effect->ParameterByName("interval_buff_uint"); interval_buff_read_param_ = effect->ParameterByName("interval_buff_read"); scale_buff_param_ = effect->ParameterByName("scale_buff"); bias_buff_param_ = effect->ParameterByName("bias_buff"); cascade_min_buff_uint_param_ = effect->ParameterByName("cascade_min_buff_uint"); cascade_max_buff_uint_param_ = effect->ParameterByName("cascade_max_buff_uint"); cascade_min_buff_read_param_ = effect->ParameterByName("cascade_min_buff_read"); cascade_max_buff_read_param_ = effect->ParameterByName("cascade_max_buff_read"); depth_tex_param_ = effect->ParameterByName("depth_tex"); num_cascades_param_ = effect->ParameterByName("num_cascades"); inv_depth_width_height_param_ = effect->ParameterByName("inv_depth_width_height"); near_far_param_ = effect->ParameterByName("near_far"); upper_left_param_ = effect->ParameterByName("upper_left"); xy_dir_param_ = effect->ParameterByName("xy_dir"); view_to_light_view_proj_param_ = effect->ParameterByName("view_to_light_view_proj"); light_space_border_param_ = effect->ParameterByName("light_space_border"); max_cascade_scale_param_ = effect->ParameterByName("max_cascade_scale"); } else { reduce_z_bounds_from_depth_pp_ = SyncLoadPostProcess("CascadedShadow.ppml", "reduce_z_bounds_from_depth"); reduce_z_bounds_from_depth_mip_map_pp_ = SyncLoadPostProcess("CascadedShadow.ppml", "reduce_z_bounds_from_depth_mip_map"); compute_log_cascades_from_z_bounds_pp_ = SyncLoadPostProcess("CascadedShadow.ppml", "compute_log_cascades_from_z_bounds"); interval_tex_ = rf.MakeTexture2D(MAX_NUM_CASCADES, 1, 1, 1, EF_GR16F, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); for (uint32_t i = 0; i < 2; ++ i) { interval_cpu_texs_[i] = rf.MakeTexture2D(MAX_NUM_CASCADES, 1, 1, 1, EF_GR16F, 1, 0, EAH_CPU_Read, nullptr); } } }