Переглянути джерело

Fixing a bug in PPS ignoring new color grading LUTs

Panagiotis Christopoulos Charitos 9 роки тому
батько
коміт
d96149bc6d

+ 4 - 0
include/anki/renderer/Pps.h

@@ -41,6 +41,8 @@ anki_internal:
 	}
 
 private:
+	static const U LUT_SIZE = 16;
+
 	FramebufferPtr m_fb;
 	ShaderResourcePtr m_frag;
 	PipelinePtr m_ppline;
@@ -50,6 +52,8 @@ private:
 	TextureResourcePtr m_lut; ///< Color grading lookup texture.
 
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& config);
+
+	void rebuildResourceGroup();
 };
 /// @}
 

+ 6 - 7
include/anki/resource/ImageLoader.h

@@ -106,16 +106,14 @@ public:
 
 	U getDepth() const
 	{
-		ANKI_ASSERT(
-			m_depthOrLayerCount != 0 && m_textureType == TextureType::_3D);
-		return m_depthOrLayerCount;
+		ANKI_ASSERT(m_textureType == TextureType::_3D);
+		return m_depth;
 	}
 
 	U getLayerCount() const
 	{
-		ANKI_ASSERT(m_depthOrLayerCount != 0
-			&& m_textureType == TextureType::_2D_ARRAY);
-		return m_depthOrLayerCount;
+		ANKI_ASSERT(m_textureType == TextureType::_2D_ARRAY);
+		return m_layerCount;
 	}
 
 	TextureType getTextureType() const
@@ -156,7 +154,8 @@ private:
 	U8 m_mipLevels = 0;
 	U32 m_width = 0;
 	U32 m_height = 0;
-	U8 m_depthOrLayerCount = 0;
+	U32 m_depth = 0;
+	U32 m_layerCount = 0;
 	DataCompression m_compression = DataCompression::NONE;
 	ColorFormat m_colorFormat = ColorFormat::NONE;
 	TextureType m_textureType = TextureType::NONE;

+ 1 - 1
sandbox/Main.cpp

@@ -68,7 +68,7 @@ Error MyApp::init(int argc, char* argv[])
 	ANKI_CHECK(getScriptManager().evalString(script->getSource()));
 
 	ANKI_CHECK(renderer.getOffscreenRenderer().getPps().loadColorGradingTexture(
-		"textures/adis/dungeon.ankitex"));
+		"textures/color_gradient_luts/forge_lut.ankitex"));
 
 #if PLAYER
 	SceneGraph& scene = getSceneGraph();

+ 0 - 2
shaders/Pps.frag.glsl

@@ -35,8 +35,6 @@ const vec2 KERNEL[8] = vec2[](vec2(TEX_OFFSET.x, TEX_OFFSET.y),
 	vec2(TEX_OFFSET.x, -TEX_OFFSET.y),
 	vec2(TEX_OFFSET.x, 0.0));
 
-const float LUT_SIZE = 16.0;
-
 //==============================================================================
 vec3 grayScale(in vec3 col)
 {

+ 26 - 14
src/renderer/Pps.cpp

@@ -65,12 +65,14 @@ Error Pps::initInternal(const ConfigSet& config)
 				"#define SHARPEN_ENABLED %u\n"
 				"#define GAMMA_CORRECTION_ENABLED %u\n"
 				"#define FBO_WIDTH %u\n"
-				"#define FBO_HEIGHT %u\n",
+				"#define FBO_HEIGHT %u\n"
+				"#define LUT_SIZE %u.0\n",
 		true,
 		U(config.getNumber("pps.sharpen")),
 		U(config.getNumber("pps.gammaCorrection")),
 		m_r->getWidth(),
-		m_r->getHeight());
+		m_r->getHeight(),
+		LUT_SIZE);
 
 	ANKI_CHECK(getResourceManager().loadResourceToCache(
 		m_frag, "shaders/Pps.frag.glsl", pps.toCString(), "r_"));
@@ -84,19 +86,8 @@ Error Pps::initInternal(const ConfigSet& config)
 	ANKI_CHECK(loadColorGradingTexture("engine_data/DefaultLut.ankitex"));
 
 	// RC goup
-	ResourceGroupInitInfo rcInit;
-	rcInit.m_textures[0].m_texture = m_r->getIs().getRt();
-	rcInit.m_textures[1].m_texture = m_r->getBloom().getFinalRt();
-
-	rcInit.m_textures[2].m_texture = m_lut->getGrTexture();
-
-	rcInit.m_storageBuffers[0].m_buffer =
-		m_r->getTm().getAverageLuminanceBuffer();
-	rcInit.m_storageBuffers[0].m_usage = BufferUsageBit::STORAGE_FRAGMENT;
+	rebuildResourceGroup();
 
-	m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
-
-	getGrManager().finish();
 	return ErrorCode::NONE;
 }
 
@@ -116,9 +107,30 @@ Error Pps::loadColorGradingTexture(CString filename)
 {
 	m_lut.reset(nullptr);
 	ANKI_CHECK(getResourceManager().loadResource(filename, m_lut));
+	ANKI_ASSERT(m_lut->getWidth() == LUT_SIZE);
+	ANKI_ASSERT(m_lut->getHeight() == LUT_SIZE);
+	ANKI_ASSERT(m_lut->getDepth() == LUT_SIZE);
+
+	rebuildResourceGroup();
 	return ErrorCode::NONE;
 }
 
+//==============================================================================
+void Pps::rebuildResourceGroup()
+{
+	ResourceGroupInitInfo rcInit;
+	rcInit.m_textures[0].m_texture = m_r->getIs().getRt();
+	rcInit.m_textures[1].m_texture = m_r->getBloom().getFinalRt();
+
+	rcInit.m_textures[2].m_texture = m_lut->getGrTexture();
+
+	rcInit.m_storageBuffers[0].m_buffer =
+		m_r->getTm().getAverageLuminanceBuffer();
+	rcInit.m_storageBuffers[0].m_usage = BufferUsageBit::STORAGE_FRAGMENT;
+
+	m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
+}
+
 //==============================================================================
 void Pps::run(RenderingContext& ctx)
 {

+ 47 - 32
src/resource/ImageLoader.cpp

@@ -341,8 +341,9 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 	GenericMemoryPoolAllocator<U8>& alloc,
 	U32& width,
 	U32& height,
-	U8& depthOrLayerCount,
-	U8& loadedMips,
+	U32& depth,
+	U32& layerCount,
+	U8& toLoadMipCount,
 	ImageLoader::TextureType& textureType,
 	ImageLoader::ColorFormat& colorFormat)
 {
@@ -421,7 +422,7 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 		maxSize = max<U>(maxSize, header.m_depthOrLayerCount);
 		size = min<U>(size, header.m_depthOrLayerCount);
 	}
-	loadedMips = 0;
+	toLoadMipCount = 0;
 	U tmpMipLevels = 0;
 	while(size >= 4) // The minimum size is 4x4
 	{
@@ -429,7 +430,7 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 
 		if(maxSize <= maxTextureSize)
 		{
-			++loadedMips;
+			++toLoadMipCount;
 		}
 
 		size /= 2;
@@ -442,21 +443,29 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 		return ErrorCode::USER_DATA;
 	}
 
-	loadedMips = min<U>(loadedMips, header.m_mipLevels);
+	toLoadMipCount = min<U>(toLoadMipCount, header.m_mipLevels);
 
 	colorFormat = header.m_colorFormat;
 
+	U faceCount = 1;
 	switch(header.m_type)
 	{
 	case ImageLoader::TextureType::_2D:
-		depthOrLayerCount = 1;
+		depth = 1;
+		layerCount = 1;
 		break;
 	case ImageLoader::TextureType::CUBE:
-		depthOrLayerCount = 6;
+		depth = 1;
+		layerCount = 1;
+		faceCount = 6;
 		break;
 	case ImageLoader::TextureType::_3D:
+		depth = header.m_depthOrLayerCount;
+		layerCount = 1;
+		break;
 	case ImageLoader::TextureType::_2D_ARRAY:
-		depthOrLayerCount = header.m_depthOrLayerCount;
+		depth = 1;
+		layerCount = header.m_depthOrLayerCount;
 		break;
 	default:
 		ANKI_ASSERT(0);
@@ -511,7 +520,7 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 	// Allocate the surfaces
 	if(header.m_type != ImageLoader::TextureType::_3D)
 	{
-		surfaces.create(alloc, loadedMips * depthOrLayerCount);
+		surfaces.create(alloc, toLoadMipCount * layerCount * faceCount);
 
 		// Read all surfaces
 		U mipWidth = header.m_width;
@@ -519,28 +528,32 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 		U index = 0;
 		for(U mip = 0; mip < header.m_mipLevels; mip++)
 		{
-			for(U d = 0; d < depthOrLayerCount; d++)
+			for(U l = 0; l < layerCount; l++)
 			{
-				U dataSize = calcSurfaceSize(mipWidth,
-					mipHeight,
-					preferredCompression,
-					header.m_colorFormat);
-
-				// Check if this mipmap can be skipped because of size
-				if(maxSize <= maxTextureSize)
-				{
-					ImageLoader::Surface& surf = surfaces[index++];
-					surf.m_width = mipWidth;
-					surf.m_height = mipHeight;
 
-					surf.m_data.create(alloc, dataSize);
-
-					ANKI_CHECK(file->read(&surf.m_data[0], dataSize));
-				}
-				else
+				for(U f = 0; f < faceCount; ++f)
 				{
-					ANKI_CHECK(file->seek(
-						dataSize, ResourceFile::SeekOrigin::CURRENT));
+					U dataSize = calcSurfaceSize(mipWidth,
+						mipHeight,
+						preferredCompression,
+						header.m_colorFormat);
+
+					// Check if this mipmap can be skipped because of size
+					if(maxSize <= maxTextureSize)
+					{
+						ImageLoader::Surface& surf = surfaces[index++];
+						surf.m_width = mipWidth;
+						surf.m_height = mipHeight;
+
+						surf.m_data.create(alloc, dataSize);
+
+						ANKI_CHECK(file->read(&surf.m_data[0], dataSize));
+					}
+					else
+					{
+						ANKI_CHECK(file->seek(
+							dataSize, ResourceFile::SeekOrigin::CURRENT));
+					}
 				}
 			}
 
@@ -550,7 +563,7 @@ static ANKI_USE_RESULT Error loadAnkiTexture(ResourceFilePtr file,
 	}
 	else
 	{
-		volumes.create(alloc, loadedMips);
+		volumes.create(alloc, toLoadMipCount);
 
 		U mipWidth = header.m_width;
 		U mipHeight = header.m_height;
@@ -618,7 +631,8 @@ Error ImageLoader::load(
 		m_surfaces.create(m_alloc, 1);
 
 		m_mipLevels = 1;
-		m_depthOrLayerCount = 1;
+		m_depth = 1;
+		m_layerCount = 1;
 		ANKI_CHECK(loadTga(file,
 			m_surfaces[0].m_width,
 			m_surfaces[0].m_height,
@@ -660,7 +674,8 @@ Error ImageLoader::load(
 			m_alloc,
 			m_width,
 			m_height,
-			m_depthOrLayerCount,
+			m_depth,
+			m_layerCount,
 			m_mipLevels,
 			m_textureType,
 			m_colorFormat));
@@ -695,7 +710,7 @@ const ImageLoader::Surface& ImageLoader::getSurface(
 		ANKI_ASSERT(0 && "Can't use that for 3D textures");
 		break;
 	case TextureType::_2D_ARRAY:
-		idx = level * m_depthOrLayerCount + layer;
+		idx = level * m_layerCount + layer;
 		break;
 	default:
 		ANKI_ASSERT(0);