Просмотр исходного кода

Decrease depth precision on mobile

Panagiotis Christopoulos Charitos 3 лет назад
Родитель
Сommit
d46118b064

+ 0 - 9
AnKi/Renderer/Common.h

@@ -76,19 +76,10 @@ constexpr U32 AVERAGE_LUMINANCE_RENDER_TARGET_SIZE = 128;
 
 extern const Array<Format, GBUFFER_COLOR_ATTACHMENT_COUNT> GBUFFER_COLOR_ATTACHMENT_PIXEL_FORMATS;
 
-constexpr Format GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT = Format::D32_SFLOAT;
-
 constexpr Format FORWARD_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT = Format::R16G16B16A16_SFLOAT;
 
 constexpr Format DBG_COLOR_ATTACHMENT_PIXEL_FORMAT = Format::R8G8B8A8_UNORM;
 
-constexpr Format SHADOW_DEPTH_PIXEL_FORMAT = Format::D32_SFLOAT;
-#if ANKI_EVSM4
-constexpr Format SHADOW_COLOR_PIXEL_FORMAT = Format::R32G32B32A32_SFLOAT;
-#else
-constexpr Format SHADOW_COLOR_PIXEL_FORMAT = Format::R32G32_SFLOAT;
-#endif
-
 /// GPU buffers and textures that the clusterer refers to.
 class ClusteredShadingContext
 {

+ 1 - 1
AnKi/Renderer/GBuffer.cpp

@@ -38,7 +38,7 @@ Error GBuffer::initInternal()
 	for(U32 i = 0; i < 2; ++i)
 	{
 		TextureInitInfo texinit = m_r->create2DRenderTargetInitInfo(
-			m_r->getInternalResolution().x(), m_r->getInternalResolution().y(), GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
+			m_r->getInternalResolution().x(), m_r->getInternalResolution().y(), m_r->getDepthNoStencilFormat(),
 			TextureUsageBit::ALL_SAMPLED | TextureUsageBit::ALL_FRAMEBUFFER_ATTACHMENT, depthRtNames[i]);
 
 		texinit.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;

+ 2 - 2
AnKi/Renderer/IndirectDiffuseProbes.cpp

@@ -139,7 +139,7 @@ Error IndirectDiffuseProbes::initGBuffer()
 		}
 
 		// Create depth RT
-		texinit.m_format = GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT;
+		texinit.m_format = m_r->getDepthNoStencilFormat();
 		texinit.setName("GI GBuff Depth");
 		m_gbuffer.m_depthRtDescr = texinit;
 		m_gbuffer.m_depthRtDescr.bake();
@@ -171,7 +171,7 @@ Error IndirectDiffuseProbes::initShadowMapping()
 
 	// RT descr
 	m_shadowMapping.m_rtDescr =
-		m_r->create2DRenderTargetDescription(resolution * 6, resolution, Format::D32_SFLOAT, "GI SM");
+		m_r->create2DRenderTargetDescription(resolution * 6, resolution, m_r->getDepthNoStencilFormat(), "GI SM");
 	m_shadowMapping.m_rtDescr.bake();
 
 	// FB descr

+ 2 - 2
AnKi/Renderer/ProbeReflections.cpp

@@ -84,7 +84,7 @@ Error ProbeReflections::initGBuffer()
 		}
 
 		// Create depth RT
-		texinit.m_format = GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT;
+		texinit.m_format = m_r->getDepthNoStencilFormat();
 		texinit.setName("CubeRefl GBuff Depth");
 		m_gbuffer.m_depthRtDescr = texinit;
 		m_gbuffer.m_depthRtDescr.bake();
@@ -188,7 +188,7 @@ Error ProbeReflections::initShadowMapping()
 
 	// RT descr
 	m_shadowMapping.m_rtDescr =
-		m_r->create2DRenderTargetDescription(resolution * 6, resolution, Format::D32_SFLOAT, "CubeRefl SM");
+		m_r->create2DRenderTargetDescription(resolution * 6, resolution, m_r->getDepthNoStencilFormat(), "CubeRefl SM");
 	m_shadowMapping.m_rtDescr.bake();
 
 	// FB descr

+ 12 - 0
AnKi/Renderer/Renderer.cpp

@@ -652,4 +652,16 @@ Format Renderer::getHdrFormat() const
 	return out;
 }
 
+Format Renderer::getDepthNoStencilFormat() const
+{
+	if(ANKI_PLATFORM_MOBILE)
+	{
+		return Format::X8_D24_UNORM_PACK32;
+	}
+	else
+	{
+		return Format::D32_SFLOAT;
+	}
+}
+
 } // end namespace anki

+ 1 - 0
AnKi/Renderer/Renderer.h

@@ -204,6 +204,7 @@ public:
 	}
 
 	Format getHdrFormat() const;
+	Format getDepthNoStencilFormat() const;
 
 	/// @name Debug render targets
 	/// @{

+ 3 - 2
AnKi/Renderer/ShadowMapping.cpp

@@ -78,7 +78,7 @@ Error ShadowMapping::initScratch()
 		// RT
 		m_scratch.m_rtDescr = m_r->create2DRenderTargetDescription(m_scratch.m_tileResolution * m_scratch.m_tileCountX,
 																   m_scratch.m_tileResolution * m_scratch.m_tileCountY,
-																   SHADOW_DEPTH_PIXEL_FORMAT, "SM scratch");
+																   m_r->getDepthNoStencilFormat(), "SM scratch");
 		m_scratch.m_rtDescr.bake();
 
 		// FB
@@ -103,11 +103,12 @@ Error ShadowMapping::initAtlas()
 		m_atlas.m_tileCountBothAxis = getConfig().getRShadowMappingTileCountPerRowOrColumn();
 
 		// RT
+		const Format texFormat = (ANKI_EVSM4) ? Format::R32G32B32A32_SFLOAT : Format::R32G32_SFLOAT;
 		TextureUsageBit usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE;
 		usage |= (preferCompute) ? TextureUsageBit::IMAGE_COMPUTE_WRITE : TextureUsageBit::ALL_FRAMEBUFFER_ATTACHMENT;
 		TextureInitInfo texinit = m_r->create2DRenderTargetInitInfo(
 			m_atlas.m_tileResolution * m_atlas.m_tileCountBothAxis,
-			m_atlas.m_tileResolution * m_atlas.m_tileCountBothAxis, SHADOW_COLOR_PIXEL_FORMAT, usage, "SM atlas");
+			m_atlas.m_tileResolution * m_atlas.m_tileCountBothAxis, texFormat, usage, "SM atlas");
 		texinit.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;
 		ClearValue clearVal;
 		clearVal.m_colorf[0] = 1.0f;