void Volumetric::run(RenderingContext& ctx) { CommandBufferPtr& cmdb = ctx.m_commandBuffer; const Frustum& frc = ctx.m_frustumComponent->getFrustum(); // Update uniforms TransientMemoryInfo dyn = ctx.m_is.m_dynBufferInfo; Vec4* uniforms = static_cast<Vec4*>(getGrManager().allocateFrameTransientMemory( sizeof(Vec4) * 2, BufferUsageBit::UNIFORM_ALL, dyn.m_uniformBuffers[3])); computeLinearizeDepthOptimal(frc.getNear(), frc.getFar(), uniforms[0].x(), uniforms[0].y()); uniforms[1] = Vec4(m_fogColor, m_fogFactor); // pass 0 cmdb->setViewport(0, 0, m_r->getWidth() / VOLUMETRIC_FRACTION, m_r->getHeight() / VOLUMETRIC_FRACTION); cmdb->beginRenderPass(m_vblurFb); cmdb->bindPipeline(m_ppline); cmdb->bindResourceGroup(m_rc, 0, &dyn); m_r->drawQuad(cmdb); cmdb->endRenderPass(); // hpass cmdb->setTextureSurfaceBarrier(m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, TextureSurfaceInfo(0, 0, 0, 0)); cmdb->setTextureSurfaceBarrier( m_tmpRt, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureSurfaceInfo(0, 0, 0, 0)); cmdb->beginRenderPass(m_hblurFb); cmdb->bindPipeline(m_hblurPpline); cmdb->bindResourceGroup(m_hblurRc, 0, nullptr); m_r->drawQuad(cmdb); cmdb->endRenderPass(); // vpass cmdb->setTextureSurfaceBarrier(m_tmpRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, TextureSurfaceInfo(0, 0, 0, 0)); cmdb->setTextureSurfaceBarrier( m_rt, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureSurfaceInfo(0, 0, 0, 0)); cmdb->beginRenderPass(m_vblurFb); cmdb->bindPipeline(m_vblurPpline); cmdb->bindResourceGroup(m_vblurRc, 0, nullptr); m_r->drawQuad(cmdb); cmdb->endRenderPass(); }
//============================================================================== void Volumetric::run(RenderingContext& ctx) { const Frustum& frc = ctx.m_frustumComponent->getFrustum(); CommandBufferPtr& cmdb = ctx.m_commandBuffer; // Update uniforms TransientMemoryInfo dyn; Vec4* uniforms = static_cast<Vec4*>( getGrManager().allocateFrameTransientMemory(sizeof(Vec4) * 2, BufferUsageBit::UNIFORM_ANY_SHADER, dyn.m_uniformBuffers[0])); computeLinearizeDepthOptimal( frc.getNear(), frc.getFar(), uniforms[0].x(), uniforms[0].y()); uniforms[1] = Vec4(m_fogColor, m_fogFactor); // Draw cmdb->bindPipeline(m_ppline); cmdb->bindResourceGroup(m_rcGroup, 0, &dyn); m_r->drawQuad(cmdb); }