void SDSMCascadedShadowLayer::DepthTexture(TexturePtr const & depth_tex) { depth_tex_ = depth_tex; if (!cs_support_) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); uint32_t const width = depth_tex->Width(0); uint32_t const height = depth_tex->Height(0); depth_deriative_tex_ = rf.MakeTexture2D(width / 2, height / 2, 0, 1, EF_GR16F, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); depth_deriative_small_tex_ = rf.MakeTexture2D(width / 4, height / 4, 0, 1, EF_GR16F, 1, 0, EAH_GPU_Write, nullptr); float delta_x = 1.0f / depth_tex_->Width(0); float delta_y = 1.0f / depth_tex_->Height(0); reduce_z_bounds_from_depth_pp_->SetParam(0, float4(delta_x, delta_y, -delta_x / 2, -delta_y / 2)); reduce_z_bounds_from_depth_pp_->InputPin(0, depth_tex_); reduce_z_bounds_from_depth_pp_->OutputPin(0, depth_deriative_tex_); reduce_z_bounds_from_depth_mip_map_pp_->InputPin(0, depth_deriative_tex_); compute_log_cascades_from_z_bounds_pp_->SetParam(0, static_cast<float>(depth_deriative_tex_->NumMipMaps() - 1)); compute_log_cascades_from_z_bounds_pp_->InputPin(0, depth_deriative_tex_); compute_log_cascades_from_z_bounds_pp_->OutputPin(0, interval_tex_); } }
void SSGILayer::GBuffer(TexturePtr const & rt0_tex, TexturePtr const & rt1_tex, TexturePtr const & depth_tex) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEngine& re = rf.RenderEngineInstance(); RenderDeviceCaps const & caps = re.DeviceCaps(); g_buffer_texs_[0] = rt0_tex; g_buffer_texs_[1] = rt1_tex; g_buffer_depth_tex_ = depth_tex; uint32_t const width = rt0_tex->Width(0); uint32_t const height = rt0_tex->Height(0); ElementFormat fmt; if (caps.rendertarget_format_support(EF_B10G11R11F, 1, 0)) { fmt = EF_B10G11R11F; } else { BOOST_ASSERT(caps.rendertarget_format_support(EF_ABGR16F, 1, 0)); fmt = EF_ABGR16F; } small_ssgi_tex_ = rf.MakeTexture2D(width / 4, height / 4, 1, 1, fmt, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); indirect_lighting_tex_ = rf.MakeTexture2D(width / 2, height / 2, 1, 1, EF_ABGR16F, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); }
void TilingPostProcess::InputPin(uint32_t index, TexturePtr const & tex) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); downsample_tex_ = rf.MakeTexture2D(tex->Width(0) / 2, tex->Height(0) / 2, 4, 1, tex->Format(), 1, 0, EAH_GPU_Read | EAH_GPU_Write | EAH_Generate_Mips); downsampler_->InputPin(index, tex); downsampler_->OutputPin(index, downsample_tex_); PostProcess::InputPin(index, downsample_tex_); }
void AsciiArtsPostProcess::InputPin(uint32_t index, TexturePtr const & tex) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); downsample_tex_ = rf.MakeTexture2D(tex->Width(0) / 2, tex->Height(0) / 2, 4, 1, tex->Format(), 1, 0, EAH_GPU_Read | EAH_GPU_Write | EAH_Generate_Mips); downsampler_->InputPin(index, tex); downsampler_->OutputPin(index, downsample_tex_); PostProcess::InputPin(index, downsample_tex_); *cell_per_row_line_ep_ = float2(static_cast<float>(CELL_WIDTH) / tex->Width(0), static_cast<float>(CELL_HEIGHT) / tex->Height(0)); }
void SSSBlurPP::InputPin(uint32_t index, TexturePtr const & tex) { PostProcess::InputPin(index, tex); if (0 == index) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); blur_x_tex_ = rf.MakeTexture2D(tex->Width(0), tex->Height(0), 1, 1, tex->Format(), 1, 0, EAH_GPU_Read | EAH_GPU_Write, NULL); blur_y_tex_ = rf.MakeTexture2D(tex->Width(0), tex->Height(0), 1, 1, tex->Format(), 1, 0, EAH_GPU_Read | EAH_GPU_Write, NULL); blur_x_fb_->Attach(FrameBuffer::ATT_Color0, rf.Make2DRenderView(*blur_x_tex_, 0, 1, 0)); blur_x_fb_->Attach(FrameBuffer::ATT_DepthStencil, frame_buffer_->Attached(FrameBuffer::ATT_DepthStencil)); blur_y_fb_->Attach(FrameBuffer::ATT_Color0, rf.Make2DRenderView(*blur_y_tex_, 0, 1, 0)); blur_y_fb_->Attach(FrameBuffer::ATT_DepthStencil, frame_buffer_->Attached(FrameBuffer::ATT_DepthStencil)); if (mrt_blend_support_) { frame_buffer_->Attach(FrameBuffer::ATT_Color1, rf.Make2DRenderView(*blur_y_tex_, 0, 1, 0)); } } }
void CartoonPostProcess::InputPin(uint32_t index, TexturePtr const & tex) { PostProcess::InputPin(index, tex); if ((0 == index) && tex) { *(technique_->Effect().ParameterByName("inv_width_height")) = float2(1.0f / tex->Width(0), 1.0f / tex->Height(0)); *(technique_->Effect().ParameterByName("inv_far")) = 1.0f / Context::Instance().AppInstance().ActiveCamera().FarPlane(); } }
void MultiResLayer::BindBuffers(TexturePtr const & rt0_tex, TexturePtr const & rt1_tex, TexturePtr const & depth_tex, TexturePtr const & multi_res_tex) { UNREF_PARAM(rt1_tex); RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEngine& re = rf.RenderEngineInstance(); RenderDeviceCaps const & caps = re.DeviceCaps(); g_buffer_rt0_tex_ = rt0_tex; g_buffer_depth_tex_ = depth_tex; ElementFormat fmt8; if (caps.rendertarget_format_support(EF_ABGR8, 1, 0)) { fmt8 = EF_ABGR8; } else { BOOST_ASSERT(caps.rendertarget_format_support(EF_ARGB8, 1, 0)); fmt8 = EF_ARGB8; } ElementFormat depth_fmt; if (caps.pack_to_rgba_required) { if (caps.rendertarget_format_support(EF_ABGR8, 1, 0)) { depth_fmt = EF_ABGR8; } else { BOOST_ASSERT(caps.rendertarget_format_support(EF_ARGB8, 1, 0)); depth_fmt = EF_ARGB8; } } else { if (caps.rendertarget_format_support(EF_R16F, 1, 0)) { depth_fmt = EF_R16F; } else { BOOST_ASSERT(caps.rendertarget_format_support(EF_R32F, 1, 0)); depth_fmt = EF_R32F; } } multi_res_tex_ = multi_res_tex; if (multi_res_tex->NumMipMaps() > 1) { depth_deriative_tex_ = rf.MakeTexture2D(multi_res_tex->Width(0), multi_res_tex->Height(0), multi_res_tex->NumMipMaps(), 1, depth_fmt, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); normal_cone_tex_ = rf.MakeTexture2D(multi_res_tex->Width(0), multi_res_tex->Height(0), multi_res_tex->NumMipMaps(), 1, fmt8, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); depth_deriative_small_tex_ = rf.MakeTexture2D(multi_res_tex->Width(1), multi_res_tex->Height(1), multi_res_tex->NumMipMaps() - 1, 1, EF_R16F, 1, 0, EAH_GPU_Write, nullptr); normal_cone_small_tex_ = rf.MakeTexture2D(multi_res_tex->Width(1), multi_res_tex->Height(1), multi_res_tex->NumMipMaps() - 1, 1, fmt8, 1, 0, EAH_GPU_Write, nullptr); multi_res_pingpong_tex_ = rf.MakeTexture2D(multi_res_tex->Width(0), multi_res_tex->Height(0), multi_res_tex->NumMipMaps() - 1, 1, multi_res_tex_->Format(), 1, 0, EAH_GPU_Write, nullptr); } multi_res_fbs_.resize(multi_res_tex->NumMipMaps()); for (uint32_t i = 0; i < multi_res_tex->NumMipMaps(); ++ i) { RenderViewPtr subsplat_ds_view = rf.Make2DDepthStencilRenderView(multi_res_tex->Width(i), multi_res_tex->Height(i), EF_D24S8, 1, 0); FrameBufferPtr fb = rf.MakeFrameBuffer(); fb->Attach(FrameBuffer::ATT_Color0, rf.Make2DRenderView(*multi_res_tex, 0, 1, i)); fb->Attach(FrameBuffer::ATT_DepthStencil, subsplat_ds_view); multi_res_fbs_[i] = fb; } }
void UITexButton::SetTexture(TexturePtr const & tex) { tex_index_ = UIManager::Instance().AddTexture(tex); if (tex) { elements_[9]->SetTexture(static_cast<uint32_t>(tex_index_), IRect(0, 0, tex->Width(0), tex->Height(0))); } else { elements_[9]->SetTexture(static_cast<uint32_t>(tex_index_), IRect(0, 0, 1, 1)); } }
void MultiResSILLayer::GBuffer(TexturePtr const & rt0_tex, TexturePtr const & rt1_tex, TexturePtr const & depth_tex) { RenderFactory& rf = Context::Instance().RenderFactoryInstance(); RenderEngine& re = rf.RenderEngineInstance(); RenderDeviceCaps const & caps = re.DeviceCaps(); g_buffer_texs_[0] = rt0_tex; g_buffer_texs_[1] = rt1_tex; g_buffer_depth_tex_ = depth_tex; ElementFormat fmt8; if (caps.rendertarget_format_support(EF_ABGR8, 1, 0)) { fmt8 = EF_ABGR8; } else { BOOST_ASSERT(caps.rendertarget_format_support(EF_ARGB8, 1, 0)); fmt8 = EF_ARGB8; } ElementFormat depth_fmt; if (caps.rendertarget_format_support(EF_R16F, 1, 0)) { depth_fmt = EF_R16F; } else { if (caps.rendertarget_format_support(EF_R32F, 1, 0)) { depth_fmt = EF_R32F; } else { BOOST_ASSERT(caps.rendertarget_format_support(EF_ABGR16F, 1, 0)); depth_fmt = EF_ABGR16F; } } uint32_t const width = rt0_tex->Width(0); uint32_t const height = rt0_tex->Height(0); int const MAX_IL_MIPMAP_LEVELS = 3; depth_deriative_tex_ = rf.MakeTexture2D(width / 2, height / 2, MAX_IL_MIPMAP_LEVELS, 1, depth_fmt, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); normal_cone_tex_ = rf.MakeTexture2D(width / 2, height / 2, MAX_IL_MIPMAP_LEVELS, 1, fmt8, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); if (depth_deriative_tex_->NumMipMaps() > 1) { depth_deriative_small_tex_ = rf.MakeTexture2D(width / 4, height / 4, MAX_IL_MIPMAP_LEVELS - 1, 1, EF_R16F, 1, 0, EAH_GPU_Write, nullptr); normal_cone_small_tex_ = rf.MakeTexture2D(width / 4, height / 4, MAX_IL_MIPMAP_LEVELS - 1, 1, fmt8, 1, 0, EAH_GPU_Write, nullptr); } indirect_lighting_tex_ = rf.MakeTexture2D(width / 2, height / 2, MAX_IL_MIPMAP_LEVELS, 1, EF_ABGR16F, 1, 0, EAH_GPU_Read | EAH_GPU_Write, nullptr); indirect_lighting_pingpong_tex_ = rf.MakeTexture2D(width / 2, height / 2, MAX_IL_MIPMAP_LEVELS - 1, 1, EF_ABGR16F, 1, 0, EAH_GPU_Write, nullptr); vpls_lighting_fbs_.resize(MAX_IL_MIPMAP_LEVELS); for (uint32_t i = 0; i < indirect_lighting_tex_->NumMipMaps(); ++ i) { RenderViewPtr subsplat_ds_view = rf.Make2DDepthStencilRenderView(indirect_lighting_tex_->Width(i), indirect_lighting_tex_->Height(i), EF_D24S8, 1, 0); FrameBufferPtr fb = rf.MakeFrameBuffer(); fb->Attach(FrameBuffer::ATT_Color0, rf.Make2DRenderView(*indirect_lighting_tex_, 0, 1, i)); fb->Attach(FrameBuffer::ATT_DepthStencil, subsplat_ds_view); vpls_lighting_fbs_[i] = fb; } }