// 建立渲染窗口 ///////////////////////////////////////////////////////////////////////////////// void OGLESRenderEngine::DoCreateRenderWindow(std::string const & name, RenderSettings const & settings) { motion_frames_ = settings.motion_frames; FrameBufferPtr win = MakeSharedPtr<OGLESRenderWindow>(name, settings); this->FillRenderDeviceCaps(); this->InitRenderStates(); win->Attach(FrameBuffer::ATT_Color0, MakeSharedPtr<OGLESScreenColorRenderView>(win->Width(), win->Height(), settings.color_fmt)); if (NumDepthBits(settings.depth_stencil_fmt) > 0) { win->Attach(FrameBuffer::ATT_DepthStencil, MakeSharedPtr<OGLESScreenDepthStencilRenderView>(win->Width(), win->Height(), settings.depth_stencil_fmt)); } this->BindFrameBuffer(win); glGenFramebuffers(1, &fbo_blit_src_); glGenFramebuffers(1, &fbo_blit_dst_); }
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 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; } }