コード例 #1
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;
}
コード例 #2
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;
}
コード例 #3
0
Error TextureAtlasResource::load(const ResourceFilename& filename, Bool async)
{
	XmlDocument doc;
	ANKI_CHECK(openFileParseXml(filename, doc));

	XmlElement rootel, el;

	//
	// <textureAtlas>
	//
	ANKI_CHECK(doc.getChildElement("textureAtlas", rootel));

	//
	// <texture>
	//
	ANKI_CHECK(rootel.getChildElement("texture", el));
	CString texFname;
	ANKI_CHECK(el.getText(texFname));
	ANKI_CHECK(getManager().loadResource<TextureResource>(texFname, m_tex, async));

	m_size[0] = m_tex->getWidth();
	m_size[1] = m_tex->getHeight();

	//
	// <subTextureMargin>
	//
	ANKI_CHECK(rootel.getChildElement("subTextureMargin", el));
	I64 margin = 0;
	ANKI_CHECK(el.getNumber(margin));
	if(margin >= I(m_tex->getWidth()) || margin >= I(m_tex->getHeight()) || margin < 0)
	{
		ANKI_RESOURCE_LOGE("Too big margin %d", U(margin));
		return Error::USER_DATA;
	}
	m_margin = margin;

	//
	// <subTextures>
	//

	// Get counts
	PtrSize namesSize = 0;
	PtrSize subTexesCount = 0;
	XmlElement subTexesEl, subTexEl;
	ANKI_CHECK(rootel.getChildElement("subTextures", subTexesEl));
	ANKI_CHECK(subTexesEl.getChildElement("subTexture", subTexEl));
	do
	{
		ANKI_CHECK(subTexEl.getChildElement("name", el));
		CString name;
		ANKI_CHECK(el.getText(name));

		if(name.getLength() < 1)
		{
			ANKI_RESOURCE_LOGE("Something wrong with the <name> tag. Probably empty");
			return Error::USER_DATA;
		}

		namesSize += name.getLength() + 1;
		++subTexesCount;

		ANKI_CHECK(subTexEl.getNextSiblingElement("subTexture", subTexEl));
	} while(subTexEl);

	// Allocate
	m_subTexNames.create(getAllocator(), namesSize);
	m_subTexes.create(getAllocator(), subTexesCount);

	// Iterate again and populate
	subTexesCount = 0;
	char* names = &m_subTexNames[0];
	ANKI_CHECK(subTexesEl.getChildElement("subTexture", subTexEl));
	do
	{
		ANKI_CHECK(subTexEl.getChildElement("name", el));
		CString name;
		ANKI_CHECK(el.getText(name));

		memcpy(names, &name[0], name.getLength() + 1);

		m_subTexes[subTexesCount].m_name = names;

		ANKI_CHECK(subTexEl.getChildElement("uv", el));
		Vec4 uv;
		ANKI_CHECK(el.getVec4(uv));
		m_subTexes[subTexesCount].m_uv = {{uv[0], uv[1], uv[2], uv[3]}};

		names += name.getLength() + 1;
		++subTexesCount;

		ANKI_CHECK(subTexEl.getNextSiblingElement("subTexture", subTexEl));
	} while(subTexEl);

	return Error::NONE;
}