示例#1
0
//==============================================================================
Error Fs::init(const ConfigSet&)
{
	m_width = m_r->getWidth() / FS_FRACTION;
	m_height = m_r->getHeight() / FS_FRACTION;

	// Create RT
	m_r->createRenderTarget(m_width,
		m_height,
		Is::RT_PIXEL_FORMAT,
		1,
		SamplingFilter::NEAREST,
		1,
		m_rt);

	FramebufferInitInfo fbInit;
	fbInit.m_colorAttachmentCount = 1;
	fbInit.m_colorAttachments[0].m_texture = m_rt;
	fbInit.m_colorAttachments[0].m_loadOperation =
		AttachmentLoadOperation::CLEAR;
	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs().getDepthRt();
	fbInit.m_depthStencilAttachment.m_loadOperation =
		AttachmentLoadOperation::LOAD;
	fbInit.m_depthStencilAttachment.m_mipmap = 1;
	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);

	// Init the global resources
	{
		ResourceGroupInitInfo init;
		init.m_textures[0].m_texture = m_r->getMs().getDepthRt();

		if(m_r->getSmEnabled())
		{
			init.m_textures[1].m_texture = m_r->getSm().getSpotTextureArray();
			init.m_textures[2].m_texture = m_r->getSm().getOmniTextureArray();
		}

		init.m_uniformBuffers[0].m_uploadedMemory = true;
		init.m_uniformBuffers[1].m_uploadedMemory = true;
		init.m_uniformBuffers[2].m_uploadedMemory = true;

		init.m_storageBuffers[0].m_uploadedMemory = true;
		init.m_storageBuffers[1].m_uploadedMemory = true;

		m_globalResources = getGrManager().newInstance<ResourceGroup>(init);
	}

	getGrManager().finish();
	return ErrorCode::NONE;
}
示例#2
0
Error Dbg::lazyInit()
{
	ANKI_ASSERT(!m_initialized);

	// RT
	m_r->createRenderTarget(m_r->getWidth(),
		m_r->getHeight(),
		DBG_COLOR_ATTACHMENT_PIXEL_FORMAT,
		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
		SamplingFilter::LINEAR,
		1,
		m_rt);

	// Create FB
	FramebufferInitInfo fbInit;
	fbInit.m_colorAttachmentCount = 1;
	fbInit.m_colorAttachments[0].m_texture = m_rt;
	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::CLEAR;
	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs().m_depthRt;
	fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::LOAD;
	fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectMask::DEPTH;

	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);

	m_drawer = getAllocator().newInstance<DebugDrawer>();
	ANKI_CHECK(m_drawer->init(m_r));

	return ErrorCode::NONE;
}
示例#3
0
Error Pps::initInternal(const ConfigSet& config)
{
	ANKI_ASSERT("Initializing PPS");

	ANKI_CHECK(loadColorGradingTexture("engine_data/DefaultLut.ankitex"));
	m_sharpenEnabled = config.getNumber("pps.sharpen");

	if(!m_r->getDrawToDefaultFramebuffer())
	{
		m_r->createRenderTarget(m_r->getWidth(),
			m_r->getHeight(),
			RT_PIXEL_FORMAT,
			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
			SamplingFilter::LINEAR,
			1,
			m_rt);

		FramebufferInitInfo fbInit;
		fbInit.m_colorAttachmentCount = 1;
		fbInit.m_colorAttachments[0].m_texture = m_rt;
		fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
		fbInit.m_colorAttachments[0].m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE;
		m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
	}

	return ErrorCode::NONE;
}
示例#4
0
Error Tiler::initInternal()
{
	// Load the program
	StringAuto pps(getAllocator());

	pps.sprintf("#define TILE_SIZE_X %u\n"
				"#define TILE_SIZE_Y %u\n"
				"#define TILES_COUNT_X %u\n"
				"#define TILES_COUNT_Y %u\n",
		TILE_SIZE,
		TILE_SIZE,
		m_r->getTileCountXY().x(),
		m_r->getTileCountXY().y());

	ANKI_CHECK(
		getResourceManager().loadResourceToCache(m_shader, "shaders/TilerMinMax.comp.glsl", pps.toCString(), "r_"));

	PipelineInitInfo pplineInit;
	pplineInit.m_shaders[U(ShaderType::COMPUTE)] = m_shader->getGrShader();
	m_ppline = getGrManager().newInstance<Pipeline>(pplineInit);

	// Allocate the buffers
	U pboSize = m_r->getTileCount() * sizeof(Vec2); // The pixel size

	for(U i = 0; i < m_outBuffers.getSize(); ++i)
	{
		// Create the buffer
		m_outBuffers[i] =
			getGrManager().newInstance<Buffer>(pboSize, BufferUsageBit::STORAGE_ALL, BufferMapAccessBit::READ);

		// Create graphics resources
		ResourceGroupInitInfo rcinit;
		rcinit.m_storageBuffers[0].m_buffer = m_outBuffers[i];
		rcinit.m_textures[0].m_texture = m_r->getMs().m_depthRt;

		m_rcGroups[i] = getGrManager().newInstance<ResourceGroup>(rcinit);
	}

	m_currentMinMax.create(getAllocator(), m_r->getTileCount());

	return ErrorCode::NONE;
}
示例#5
0
Error Is::binLights(RenderingContext& ctx)
{
	updateCommonBlock(ctx);

	TexturePtr diffDecalTex, normRoughnessDecalTex;

	ANKI_CHECK(m_lightBin->bin(*ctx.m_frustumComponent,
		getFrameAllocator(),
		m_maxLightIds,
		true,
		ctx.m_is.m_dynBufferInfo.m_uniformBuffers[P_LIGHTS_LOCATION],
		ctx.m_is.m_dynBufferInfo.m_uniformBuffers[S_LIGHTS_LOCATION],
		&ctx.m_is.m_dynBufferInfo.m_uniformBuffers[PROBES_LOCATION],
		ctx.m_is.m_dynBufferInfo.m_uniformBuffers[DECALS_LOCATION],
		ctx.m_is.m_dynBufferInfo.m_storageBuffers[CLUSTERS_LOCATION],
		ctx.m_is.m_dynBufferInfo.m_storageBuffers[LIGHT_IDS_LOCATION],
		diffDecalTex,
		normRoughnessDecalTex));

	ResourceGroupInitInfo rcinit;
	if(diffDecalTex)
	{
		rcinit.m_textures[0].m_texture = diffDecalTex;
	}
	else
	{
		// Bind something because validation layers will complain
		rcinit.m_textures[0].m_texture = m_dummyTex;
	}

	if(normRoughnessDecalTex)
	{
		rcinit.m_textures[1].m_texture = normRoughnessDecalTex;
	}
	else
	{
		rcinit.m_textures[1].m_texture = m_dummyTex;
	}

	U64 hash = rcinit.computeHash();
	if(hash != m_rcGroup1Hash)
	{
		m_rcGroup1Hash = hash;

		m_rcGroup1 = getGrManager().newInstance<ResourceGroup>(rcinit);
	}

	return ErrorCode::NONE;
}
//==============================================================================
Error BlurringRenderingPass::initBlurring(
	Renderer& r, U width, U height, U samples, F32 blurringDistance)
{
	Array<StringAuto, 2> pps = {{getAllocator(), getAllocator()}};

	pps[1].sprintf(
		"#define HPASS\n"
		"#define COL_RGB\n"
		"#define BLURRING_DIST float(%f)\n"
		"#define IMG_DIMENSION %u\n"
		"#define SAMPLES %u\n",
		blurringDistance, height, samples);

	pps[0].sprintf(
		"#define VPASS\n"
		"#define COL_RGB\n"
		"#define BLURRING_DIST float(%f)\n"
		"#define IMG_DIMENSION %u\n"
		"#define SAMPLES %u\n",
		blurringDistance, width, samples);

	for(U i = 0; i < 2; i++)
	{
		Direction& dir = m_dirs[i];

		r.createRenderTarget(width, height,
			PixelFormat(ComponentFormat::R8G8B8, TransformFormat::UNORM),
			1, SamplingFilter::LINEAR, 1, dir.m_rt);

		// Create FB
		FramebufferPtr::Initializer fbInit;
		fbInit.m_colorAttachmentsCount = 1;
		fbInit.m_colorAttachments[0].m_texture = dir.m_rt;
		fbInit.m_colorAttachments[0].m_loadOperation =
			AttachmentLoadOperation::DONT_CARE;
		dir.m_fb.create(&getGrManager(), fbInit);

		ANKI_CHECK(dir.m_frag.loadToCache(&getResourceManager(),
			"shaders/VariableSamplingBlurGeneric.frag.glsl",
			pps[i].toCString(), "r_"));

		ANKI_CHECK(r.createDrawQuadPipeline(
			dir.m_frag->getGrShader(), dir.m_ppline));
	}

	return ErrorCode::NONE;
}
示例#7
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();
}
示例#8
0
void Is::updateCommonBlock(RenderingContext& ctx)
{
	const FrustumComponent& fr = *ctx.m_frustumComponent;
	ShaderCommonUniforms* blk =
		static_cast<ShaderCommonUniforms*>(getGrManager().allocateFrameTransientMemory(sizeof(ShaderCommonUniforms),
			BufferUsageBit::UNIFORM_ALL,
			ctx.m_is.m_dynBufferInfo.m_uniformBuffers[COMMON_VARS_LOCATION]));

	// Start writing
	blk->m_projectionParams = fr.getProjectionParameters();
	blk->m_viewMat = fr.getViewMatrix().getTransposed();
	blk->m_nearFarClustererMagicPad1 = Vec4(
		fr.getFrustum().getNear(), fr.getFrustum().getFar(), m_lightBin->getClusterer().getShaderMagicValue(), 0.0);

	blk->m_invViewRotation = Mat3x4(fr.getViewMatrix().getInverse().getRotationPart());

	blk->m_rendererSizeTimePad1 = Vec4(m_r->getWidth(), m_r->getHeight(), HighRezTimer::getCurrentTime(), 0.0);

	blk->m_tileCount = UVec4(m_r->getTileCountXY(), m_lightBin->getClusterer().getClusterCountZ(), m_r->getTileCount());
}
示例#9
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);
}
示例#10
0
//==============================================================================
Error Volumetric::init(const ConfigSet& config)
{
	// Create frag shader
	ANKI_CHECK(getResourceManager().loadResource(
		"shaders/Volumetric.frag.glsl", m_frag));

	// Create ppline
	ColorStateInfo colorState;
	colorState.m_attachmentCount = 1;
	colorState.m_attachments[0].m_srcBlendMethod = BlendMethod::ONE;
	colorState.m_attachments[0].m_dstBlendMethod = BlendMethod::ONE;

	m_r->createDrawQuadPipeline(m_frag->getGrShader(), colorState, m_ppline);

	// Create the resource group
	ResourceGroupInitInfo rcInit;
	rcInit.m_textures[0].m_texture = m_r->getMs().getDepthRt();
	rcInit.m_uniformBuffers[0].m_uploadedMemory = true;

	m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);

	return ErrorCode::NONE;
}
示例#11
0
Error Pps::run(RenderingContext& ctx)
{
	CommandBufferPtr& cmdb = ctx.m_commandBuffer;

	// Get the drawing parameters
	Bool drawToDefaultFb = ctx.m_outFb.isCreated();
	Bool dbgEnabled = m_r->getDbg().getEnabled();

	// Get or create the ppline
	PipelinePtr& ppline = m_ppline[drawToDefaultFb][dbgEnabled];

	if(!ppline)
	{
		// Need to create it

		ShaderResourcePtr& frag = m_frag[drawToDefaultFb][dbgEnabled];
		if(!frag)
		{
			StringAuto pps(ctx.m_tempAllocator);

			pps.sprintf("#define BLOOM_ENABLED %u\n"
						"#define SHARPEN_ENABLED %u\n"
						"#define FBO_WIDTH %u\n"
						"#define FBO_HEIGHT %u\n"
						"#define LUT_SIZE %u.0\n"
						"#define DBG_ENABLED %u\n"
						"#define DRAW_TO_DEFAULT %u\n"
						"#define SMAA_ENABLED 1\n"
						"#define SMAA_RT_METRICS vec4(%f, %f, %f, %f)\n"
						"#define SMAA_PRESET_%s\n",
				true,
				m_sharpenEnabled,
				m_r->getWidth(),
				m_r->getHeight(),
				LUT_SIZE,
				dbgEnabled,
				drawToDefaultFb,
				1.0 / m_r->getWidth(),
				1.0 / m_r->getHeight(),
				F32(m_r->getWidth()),
				F32(m_r->getHeight()),
				&m_r->getSmaa().m_qualityPerset[0]);

			ANKI_CHECK(getResourceManager().loadResourceToCache(frag, "shaders/Pps.frag.glsl", pps.toCString(), "r_"));
		}

		if(!m_vert)
		{
			StringAuto pps(ctx.m_tempAllocator);

			pps.sprintf("#define SMAA_ENABLED 1\n"
						"#define SMAA_RT_METRICS vec4(%f, %f, %f, %f)\n"
						"#define SMAA_PRESET_%s\n",
				1.0 / m_r->getWidth(),
				1.0 / m_r->getHeight(),
				F32(m_r->getWidth()),
				F32(m_r->getHeight()),
				&m_r->getSmaa().m_qualityPerset[0]);

			ANKI_CHECK(
				getResourceManager().loadResourceToCache(m_vert, "shaders/Pps.vert.glsl", pps.toCString(), "r_"));
		}

		PixelFormat pfs = (drawToDefaultFb) ? PixelFormat(ComponentFormat::DEFAULT_FRAMEBUFFER, TransformFormat::NONE)
											: RT_PIXEL_FORMAT;

		PipelineInitInfo ppinit;

		ppinit.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP;

		ppinit.m_depthStencil.m_depthWriteEnabled = false;
		ppinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;

		ppinit.m_color.m_attachmentCount = 1;
		ppinit.m_color.m_attachments[0].m_format = pfs;

		ppinit.m_shaders[ShaderType::VERTEX] = m_vert->getGrShader();
		ppinit.m_shaders[ShaderType::FRAGMENT] = frag->getGrShader();

		ppline = m_r->getGrManager().newInstance<Pipeline>(ppinit);
	}

	// Get or create the resource group
	ResourceGroupPtr& rsrc = m_rcGroup[dbgEnabled];
	if(!rsrc || m_lutDirty)
	{
		ResourceGroupInitInfo rcInit;
		rcInit.m_textures[0].m_texture = m_r->getIs().getRt();
		rcInit.m_textures[1].m_texture = m_r->getBloom().m_upscale.m_rt;
		rcInit.m_textures[2].m_texture = m_lut->getGrTexture();
		rcInit.m_textures[3].m_texture = m_r->getSmaa().m_weights.m_rt;
		if(dbgEnabled)
		{
			rcInit.m_textures[4].m_texture = m_r->getDbg().getRt();
		}

		rcInit.m_storageBuffers[0].m_buffer = m_r->getTm().getAverageLuminanceBuffer();
		rcInit.m_storageBuffers[0].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ;

		rsrc = getGrManager().newInstance<ResourceGroup>(rcInit);

		m_lutDirty = false;
	}

	// Get or create FB
	FramebufferPtr* fb = nullptr;
	U width, height;
	if(drawToDefaultFb)
	{
		fb = &ctx.m_outFb;
		width = ctx.m_outFbWidth;
		height = ctx.m_outFbHeight;
	}
	else
	{
		width = m_r->getWidth();
		height = m_r->getHeight();
		fb = &m_fb;
	}

	cmdb->beginRenderPass(*fb);
	cmdb->setViewport(0, 0, width, height);
	cmdb->bindPipeline(ppline);
	cmdb->bindResourceGroup(rsrc, 0, nullptr);
	m_r->drawQuad(cmdb);
	cmdb->endRenderPass();

	if(!drawToDefaultFb)
	{
		cmdb->setTextureSurfaceBarrier(m_rt,
			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
			TextureUsageBit::SAMPLED_FRAGMENT,
			TextureSurfaceInfo(0, 0, 0, 0));
	}

	return ErrorCode::NONE;
}
示例#12
0
Error Volumetric::init(const ConfigSet& config)
{
	U width = m_r->getWidth() / VOLUMETRIC_FRACTION;
	U height = m_r->getHeight() / VOLUMETRIC_FRACTION;

	// Create RTs
	m_r->createRenderTarget(width,
		height,
		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
		SamplingFilter::LINEAR,
		1,
		m_rt);
	m_r->createRenderTarget(width,
		height,
		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::CLEAR,
		SamplingFilter::LINEAR,
		1,
		m_tmpRt);

	m_r->clearRenderTarget(m_tmpRt, ClearValue(), TextureUsageBit::SAMPLED_FRAGMENT);

	// Create shaders
	ANKI_CHECK(m_r->createShader("shaders/Volumetric.frag.glsl",
		m_frag,
		"#define RPASS_SIZE uvec2(%uu, %uu)\n"
		"#define CLUSTER_COUNT uvec3(%uu, %uu, %uu)\n",
		width,
		height,
		m_r->getIs().getLightBin().getClusterer().getClusterCountX(),
		m_r->getIs().getLightBin().getClusterer().getClusterCountY(),
		m_r->getIs().getLightBin().getClusterer().getClusterCountZ()));

	ANKI_CHECK(m_r->createShader("shaders/GaussianBlurGeneric.frag.glsl",
		m_hblurFrag,
		"#define HPASS\n"
		"#define COL_RGB\n"
		"#define TEXTURE_SIZE vec2(%f, %f)\n"
		"#define KERNEL_SIZE 11\n",
		F32(width),
		F32(height)));

	ANKI_CHECK(m_r->createShader("shaders/GaussianBlurGeneric.frag.glsl",
		m_vblurFrag,
		"#define VPASS\n"
		"#define COL_RGB\n"
		"#define TEXTURE_SIZE vec2(%f, %f)\n"
		"#define KERNEL_SIZE 11\n",
		F32(width),
		F32(height)));

	// Create pplines
	ColorStateInfo state;
	state.m_attachmentCount = 1;
	state.m_attachments[0].m_format = IS_COLOR_ATTACHMENT_PIXEL_FORMAT;

	m_r->createDrawQuadPipeline(m_frag->getGrShader(), state, m_ppline);
	m_r->createDrawQuadPipeline(m_hblurFrag->getGrShader(), state, m_hblurPpline);
	m_r->createDrawQuadPipeline(m_vblurFrag->getGrShader(), state, m_vblurPpline);

	// Create the resource groups
	ResourceGroupInitInfo rcInit;
	rcInit.m_textures[0].m_texture = m_r->getHalfDepth().m_depthRt;
	rcInit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
	rcInit.m_textures[1].m_texture = m_tmpRt;
	rcInit.m_textures[2].m_texture = m_r->getSm().getSpotTextureArray();
	rcInit.m_textures[3].m_texture = m_r->getSm().getOmniTextureArray();
	rcInit.m_uniformBuffers[0].m_uploadedMemory = true;
	rcInit.m_uniformBuffers[0].m_usage = BufferUsageBit::UNIFORM_FRAGMENT;
	rcInit.m_uniformBuffers[1].m_uploadedMemory = true;
	rcInit.m_uniformBuffers[1].m_usage = BufferUsageBit::UNIFORM_FRAGMENT;
	rcInit.m_uniformBuffers[2].m_uploadedMemory = true;
	rcInit.m_uniformBuffers[2].m_usage = BufferUsageBit::UNIFORM_FRAGMENT;
	rcInit.m_uniformBuffers[3].m_uploadedMemory = true;
	rcInit.m_uniformBuffers[3].m_usage = BufferUsageBit::UNIFORM_FRAGMENT;
	rcInit.m_storageBuffers[0].m_uploadedMemory = true;
	rcInit.m_storageBuffers[0].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ;
	rcInit.m_storageBuffers[1].m_uploadedMemory = true;
	rcInit.m_storageBuffers[1].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ;
	m_rc = getGrManager().newInstance<ResourceGroup>(rcInit);

	rcInit = ResourceGroupInitInfo();
	rcInit.m_textures[0].m_texture = m_rt;
	m_hblurRc = getGrManager().newInstance<ResourceGroup>(rcInit);

	rcInit.m_textures[0].m_texture = m_tmpRt;
	m_vblurRc = getGrManager().newInstance<ResourceGroup>(rcInit);

	// Create FBs
	FramebufferInitInfo fbInit;
	fbInit.m_colorAttachmentCount = 1;
	fbInit.m_colorAttachments[0].m_texture = m_tmpRt;
	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
	fbInit.m_colorAttachments[0].m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE;
	m_hblurFb = getGrManager().newInstance<Framebuffer>(fbInit);

	fbInit.m_colorAttachments[0].m_texture = m_rt;
	m_vblurFb = getGrManager().newInstance<Framebuffer>(fbInit);

	return ErrorCode::NONE;
}
示例#13
0
Error Is::initInternal(const ConfigSet& config)
{
	m_maxLightIds = config.getNumber("is.maxLightsPerCluster");

	if(m_maxLightIds == 0)
	{
		ANKI_LOGE("Incorrect number of max light indices");
		return ErrorCode::USER_DATA;
	}

	m_rtMipCount = computeMaxMipmapCount2d(m_r->getWidth(), m_r->getHeight(), 32);
	ANKI_ASSERT(m_rtMipCount);

	U clusterCount = m_r->getTileCountXY().x() * m_r->getTileCountXY().y() * config.getNumber("clusterSizeZ");
	m_clusterCount = clusterCount;
	m_maxLightIds *= clusterCount;

	m_lightBin = getAllocator().newInstance<LightBin>(getAllocator(),
		m_r->getTileCountXY().x(),
		m_r->getTileCountXY().y(),
		config.getNumber("clusterSizeZ"),
		&m_r->getThreadPool(),
		&getGrManager());

	//
	// Load the programs
	//
	StringAuto pps(getAllocator());

	pps.sprintf("\n#define TILE_COUNT_X %u\n"
				"#define TILE_COUNT_Y %u\n"
				"#define CLUSTER_COUNT %u\n"
				"#define RENDERER_WIDTH %u\n"
				"#define RENDERER_HEIGHT %u\n"
				"#define MAX_LIGHT_INDICES %u\n"
				"#define POISSON %u\n"
				"#define INDIRECT_ENABLED %u\n"
				"#define IR_MIPMAP_COUNT %u\n",
		m_r->getTileCountXY().x(),
		m_r->getTileCountXY().y(),
		clusterCount,
		m_r->getWidth(),
		m_r->getHeight(),
		m_maxLightIds,
		m_r->getSm().getPoissonEnabled(),
		1,
		m_r->getIr().getReflectionTextureMipmapCount());

	// point light
	ANKI_CHECK(getResourceManager().loadResourceToCache(m_lightVert, "shaders/Is.vert.glsl", pps.toCString(), "r_"));

	ANKI_CHECK(getResourceManager().loadResourceToCache(m_lightFrag, "shaders/Is.frag.glsl", pps.toCString(), "r_"));

	PipelineInitInfo init;

	init.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP;
	init.m_depthStencil.m_depthWriteEnabled = false;
	init.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
	init.m_color.m_attachmentCount = 1;
	init.m_color.m_attachments[0].m_format = IS_COLOR_ATTACHMENT_PIXEL_FORMAT;
	init.m_shaders[U(ShaderType::VERTEX)] = m_lightVert->getGrShader();
	init.m_shaders[U(ShaderType::FRAGMENT)] = m_lightFrag->getGrShader();
	m_lightPpline = getGrManager().newInstance<Pipeline>(init);

	//
	// Create framebuffer
	//
	m_r->createRenderTarget(m_r->getWidth(),
		m_r->getHeight(),
		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE
			| TextureUsageBit::SAMPLED_COMPUTE,
		SamplingFilter::LINEAR,
		m_rtMipCount,
		m_rt);

	FramebufferInitInfo fbInit;
	fbInit.m_colorAttachmentCount = 1;
	fbInit.m_colorAttachments[0].m_texture = m_rt;
	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
	fbInit.m_colorAttachments[0].m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE;
	m_fb = getGrManager().newInstance<Framebuffer>(fbInit);

	//
	// Create resource group
	//
	{
		ResourceGroupInitInfo init;
		init.m_textures[0].m_texture = m_r->getMs().m_rt0;
		init.m_textures[1].m_texture = m_r->getMs().m_rt1;
		init.m_textures[2].m_texture = m_r->getMs().m_rt2;
		init.m_textures[3].m_texture = m_r->getMs().m_depthRt;
		init.m_textures[3].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
		init.m_textures[4].m_texture = m_r->getSm().getSpotTextureArray();
		init.m_textures[5].m_texture = m_r->getSm().getOmniTextureArray();

		init.m_textures[6].m_texture = m_r->getIr().getReflectionTexture();
		init.m_textures[7].m_texture = m_r->getIr().getIrradianceTexture();

		init.m_textures[8].m_texture = m_r->getIr().getIntegrationLut();
		init.m_textures[8].m_sampler = m_r->getIr().getIntegrationLutSampler();

		init.m_uniformBuffers[0].m_uploadedMemory = true;
		init.m_uniformBuffers[0].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX;
		init.m_uniformBuffers[1].m_uploadedMemory = true;
		init.m_uniformBuffers[1].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX;
		init.m_uniformBuffers[2].m_uploadedMemory = true;
		init.m_uniformBuffers[2].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX;
		init.m_uniformBuffers[3].m_uploadedMemory = true;
		init.m_uniformBuffers[3].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX;
		init.m_uniformBuffers[4].m_uploadedMemory = true;
		init.m_uniformBuffers[4].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX;

		init.m_storageBuffers[0].m_uploadedMemory = true;
		init.m_storageBuffers[0].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ | BufferUsageBit::STORAGE_VERTEX_READ;
		init.m_storageBuffers[1].m_uploadedMemory = true;
		init.m_storageBuffers[1].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ | BufferUsageBit::STORAGE_VERTEX_READ;

		m_rcGroup = getGrManager().newInstance<ResourceGroup>(init);
	}

	TextureInitInfo texinit;
	texinit.m_width = texinit.m_height = 4;
	texinit.m_usage = TextureUsageBit::SAMPLED_FRAGMENT;
	texinit.m_format = PixelFormat(ComponentFormat::R8G8B8A8, TransformFormat::UNORM);
	m_dummyTex = getGrManager().newInstance<Texture>(texinit);

	return ErrorCode::NONE;
}
示例#14
0
Error Is::getOrCreatePipeline(ShaderVariantBit variantMask, RenderingContext& ctx, PipelinePtr& ppline)
{
	auto it = m_shaderVariantMap.find(variantMask);
	if(it != m_shaderVariantMap.getEnd())
	{
		ppline = it->m_lightPpline;
	}
	else
	{
		StringAuto pps(ctx.m_tempAllocator);

		pps.sprintf("#define TILE_COUNT_X %u\n"
					"#define TILE_COUNT_Y %u\n"
					"#define CLUSTER_COUNT %u\n"
					"#define RENDERER_WIDTH %u\n"
					"#define RENDERER_HEIGHT %u\n"
					"#define MAX_LIGHT_INDICES %u\n"
					"#define POISSON %u\n"
					"#define INDIRECT_ENABLED %u\n"
					"#define IR_MIPMAP_COUNT %u\n"
					"#define POINT_LIGHTS_ENABLED %u\n"
					"#define SPOT_LIGHTS_ENABLED %u\n"
					"#define DECALS_ENABLED %u\n"
					"#define POINT_LIGHTS_SHADOWS_ENABLED %u\n"
					"#define SPOT_LIGHTS_SHADOWS_ENABLED %u\n",
			m_r->getTileCountXY().x(),
			m_r->getTileCountXY().y(),
			m_clusterCount,
			m_r->getWidth(),
			m_r->getHeight(),
			m_maxLightIds,
			m_r->getSm().getPoissonEnabled(),
			!!(variantMask & ShaderVariantBit::INDIRECT),
			m_r->getIr().getReflectionTextureMipmapCount(),
			!!(variantMask & ShaderVariantBit::P_LIGHTS),
			!!(variantMask & ShaderVariantBit::S_LIGHTS),
			!!(variantMask & ShaderVariantBit::DECALS),
			!!(variantMask & ShaderVariantBit::P_LIGHTS_SHADOWS),
			!!(variantMask & ShaderVariantBit::S_LIGHTS_SHADOWS));

		ShaderVariant variant;
		ANKI_CHECK(getResourceManager().loadResourceToCache(
			variant.m_lightFrag, "shaders/Is.frag.glsl", pps.toCString(), "r_"));

		PipelineInitInfo init;

		init.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP;
		init.m_depthStencil.m_depthWriteEnabled = false;
		init.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
		init.m_color.m_attachmentCount = 1;
		init.m_color.m_attachments[0].m_format = IS_COLOR_ATTACHMENT_PIXEL_FORMAT;
		init.m_shaders[U(ShaderType::VERTEX)] = m_lightVert->getGrShader();
		init.m_shaders[U(ShaderType::FRAGMENT)] = m_lightFrag->getGrShader();
		variant.m_lightPpline = getGrManager().newInstance<Pipeline>(init);

		ppline = variant.m_lightPpline;

		m_shaderVariantMap.pushBack(getAllocator(), variantMask, variant);
	}

	return ErrorCode::NONE;
}