Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
//==============================================================================
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);
}