Jelajahi Sumber

GPU visibility: Add HZB to non-renderables which I had forgot

Panagiotis Christopoulos Charitos 2 minggu lalu
induk
melakukan
77f815669a

+ 3 - 3
AnKi/Editor/EditorUi.cpp

@@ -264,16 +264,16 @@ void EditorUi::mainMenu()
 		if(ImGui::BeginMenu(ICON_MDI_CUBE_SCAN " Debug"))
 		{
 			Bool bBoundingBoxes = !!(Renderer::getSingleton().getDbg().getOptions() & DbgOption::kBoundingBoxes);
-			if(ImGui::Checkbox("Bounding Boxes", &bBoundingBoxes))
+			if(ImGui::Checkbox("Visible Renderables", &bBoundingBoxes))
 			{
 				DbgOption options = Renderer::getSingleton().getDbg().getOptions();
 				if(bBoundingBoxes)
 				{
-					options |= DbgOption::kBoundingBoxes | DbgOption::kIcons;
+					options |= DbgOption::kBoundingBoxes;
 				}
 				else
 				{
-					options &= ~(DbgOption::kBoundingBoxes | DbgOption::kIcons);
+					options &= ~(DbgOption::kBoundingBoxes);
 				}
 				Renderer::getSingleton().getDbg().setOptions(options);
 			}

+ 1 - 1
AnKi/Gr/CommandBuffer.h

@@ -147,7 +147,7 @@ public:
 	void setFillMode(FillMode mode);
 
 	/// Set cull mode.
-	/// By default it's FaceSelectionBit::BACK.
+	/// By default it's FaceSelectionBit::kBack.
 	void setCullMode(FaceSelectionBit mode);
 
 	/// Set depth offset and units. Set zeros to both to disable it.

+ 9 - 8
AnKi/Renderer/Dbg.cpp

@@ -124,7 +124,6 @@ void Dbg::drawNonRenderable(GpuSceneNonRenderableObjectType type, U32 objCount,
 							CommandBuffer& cmdb)
 {
 	ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
-	variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", !!(m_options & DbgOption::kDitheredDepthTest));
 	variantInitInfo.addMutation("OBJECT_TYPE", U32(type));
 	variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "Bilboards");
 	const ShaderProgramResourceVariant* variant;
@@ -136,9 +135,13 @@ void Dbg::drawNonRenderable(GpuSceneNonRenderableObjectType type, U32 objCount,
 	public:
 		Mat4 m_viewProjMat;
 		Mat3x4 m_camTrf;
+
+		UVec3 m_padding;
+		U32 m_depthFailureVisualization;
 	} consts;
 	consts.m_viewProjMat = ctx.m_matrices.m_viewProjection;
 	consts.m_camTrf = ctx.m_matrices.m_cameraTransform;
+	consts.m_depthFailureVisualization = !(m_options & DbgOption::kDepthTest);
 	cmdb.setFastConstants(&consts, sizeof(consts));
 
 	cmdb.bindSrv(1, 0, getClusterBinning().getPackedObjectsBuffer(type));
@@ -217,13 +220,11 @@ void Dbg::populateRenderGraphMain(RenderingContext& ctx)
 		cmdb.setDepthCompareOperation(!!(m_options & DbgOption::kDepthTest) ? CompareOperation::kLess : CompareOperation::kAlways);
 		cmdb.setLineWidth(2.0f);
 
-		cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
 		rgraphCtx.bindSrv(0, 0, getGBuffer().getDepthRt());
 
 		// Common code for boxes stuff
 		{
 			ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
-			variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", !!(m_options & DbgOption::kDitheredDepthTest));
 			variantInitInfo.addMutation("OBJECT_TYPE", 0);
 			variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "RenderableBoxes");
 			const ShaderProgramResourceVariant* variant;
@@ -235,9 +236,13 @@ void Dbg::populateRenderGraphMain(RenderingContext& ctx)
 			public:
 				Vec4 m_color;
 				Mat4 m_viewProjMat;
+
+				UVec3 m_padding;
+				U32 m_depthFailureVisualization;
 			} consts;
-			consts.m_color = Vec4(1.0f, 0.0f, 1.0f, 1.0f);
+			consts.m_color = Vec4(1.0f, 1.0f, 0.0f, 1.0f);
 			consts.m_viewProjMat = ctx.m_matrices.m_viewProjection;
+			consts.m_depthFailureVisualization = !(m_options & DbgOption::kDepthTest);
 
 			cmdb.setFastConstants(&consts, sizeof(consts));
 			cmdb.bindVertexBuffer(0, BufferView(m_cubeVertsBuffer.get()), sizeof(Vec3));
@@ -324,7 +329,6 @@ void Dbg::populateRenderGraphMain(RenderingContext& ctx)
 				memcpy(colors, drawerInterface.m_colors.getBegin(), drawerInterface.m_colors.getSizeInBytes());
 
 				ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
-				variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", !!(m_options & DbgOption::kDitheredDepthTest));
 				variantInitInfo.addMutation("OBJECT_TYPE", 0);
 				variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "Lines");
 				const ShaderProgramResourceVariant* variant;
@@ -406,7 +410,6 @@ void Dbg::populateRenderGraphObjectPicking(RenderingContext& ctx)
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
-			variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", 0);
 			variantInitInfo.addMutation("OBJECT_TYPE", 0);
 			variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kCompute, "PrepareRenderableUuids");
 			const ShaderProgramResourceVariant* variant;
@@ -471,7 +474,6 @@ void Dbg::populateRenderGraphObjectPicking(RenderingContext& ctx)
 				cmdb.setDepthCompareOperation(CompareOperation::kLess);
 
 				ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
-				variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", 0);
 				variantInitInfo.addMutation("OBJECT_TYPE", 0);
 				variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "RenderableUuids");
 				const ShaderProgramResourceVariant* variant;
@@ -517,7 +519,6 @@ void Dbg::populateRenderGraphObjectPicking(RenderingContext& ctx)
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
-			variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", 0);
 			variantInitInfo.addMutation("OBJECT_TYPE", 0);
 			variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kCompute, "RenderableUuidsPick");
 			const ShaderProgramResourceVariant* variant;

+ 4 - 4
AnKi/Renderer/Dbg.h

@@ -21,15 +21,15 @@ enum class DbgOption : U8
 	kIcons = 1 << 1,
 	kPhysics = 1 << 2,
 	kObjectPicking = 1 << 3,
+	kSelectedObjectOutline = 1 << 4,
 
 	// Flags that affect how things are drawn
-	kDepthTest = 1 << 4,
-	kDitheredDepthTest = 1 << 5,
+	kDepthTest = 1 << 5,
 
 	// Agregate flags
 	kGatherAabbs = kBoundingBoxes | kObjectPicking,
-	kDbgScene = kBoundingBoxes | kIcons | kPhysics,
-	kDbgEnabled = kDbgScene | kObjectPicking,
+	kDbgScene = kBoundingBoxes | kIcons | kPhysics | kSelectedObjectOutline,
+	kDbgEnabled = kDbgScene | kObjectPicking | kSelectedObjectOutline,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(DbgOption)
 

+ 10 - 2
AnKi/Renderer/Utils/GpuVisibility.cpp

@@ -1040,13 +1040,14 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 
 	pass.setWork([this, objType = in.m_objectType, feedbackBuffer = in.m_cpuFeedbackBuffer, viewProjectionMat = in.m_viewProjectionMat,
 				  visibleIndicesBuffHandle = out.m_visiblesBufferHandle, counterBuffer = m_counterBuffer, counterBufferOffset = m_counterBufferOffset,
-				  objCount](RenderPassWorkContext& rgraph) {
+				  objCount, hzbRt = (in.m_hzbRt) ? *in.m_hzbRt : RenderTargetHandle()](RenderPassWorkContext& rgraph) {
 		ANKI_TRACE_SCOPED_EVENT(GpuVisNonRenderables);
 		CommandBuffer& cmdb = *rgraph.m_commandBuffer;
 
 		const Bool needsFeedback = feedbackBuffer.isValid();
+		const Bool hasHzb = hzbRt.isValid();
 
-		cmdb.bindShaderProgram(m_grProgs[0][objType][needsFeedback].get());
+		cmdb.bindShaderProgram(m_grProgs[hasHzb][objType][needsFeedback].get());
 
 		BufferView objBuffer;
 		switch(objType)
@@ -1078,6 +1079,7 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 		{
 			consts.m_clipPlanes[i] = Vec4(planes[i].getNormal().xyz(), planes[i].getOffset());
 		}
+		consts.m_viewProjectionMat = viewProjectionMat;
 		cmdb.setFastConstants(&consts, sizeof(consts));
 
 		rgraph.bindUav(0, 0, visibleIndicesBuffHandle);
@@ -1088,6 +1090,12 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 			cmdb.bindUav(2, 0, feedbackBuffer);
 		}
 
+		if(hasHzb)
+		{
+			rgraph.bindSrv(1, 0, hzbRt);
+			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
+		}
+
 		dispatchPPCompute(cmdb, 64, 1, objCount, 1);
 	});
 }

+ 53 - 60
AnKi/Shaders/Dbg.ankiprog

@@ -3,12 +3,11 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#pragma anki mutator DEPTH_FAIL_VISUALIZATION 0 1
 #pragma anki mutator OBJECT_TYPE 0 1 2 3 4 // Same as GpuSceneNonRenderableObjectType
 
-#pragma anki technique RenderableBoxes vert pixel mutators DEPTH_FAIL_VISUALIZATION
+#pragma anki technique RenderableBoxes vert pixel mutators
 #pragma anki technique Bilboards vert pixel
-#pragma anki technique Lines vert pixel mutators DEPTH_FAIL_VISUALIZATION
+#pragma anki technique Lines vert pixel mutators
 
 // Prepare the indirect calls for RenderableUuids
 #pragma anki technique PrepareRenderableUuids comp mutators
@@ -26,20 +25,23 @@
 // ===========================================================================
 // RenderableBoxes                                                           =
 // ===========================================================================
-#if NOT_ZERO(ANKI_TECHNIQUE_RenderableBoxes)
-#	include <AnKi/Shaders/Include/GpuSceneTypes.h>
+#if ANKI_TECHNIQUE_RenderableBoxes
+
+StructuredBuffer<GpuSceneRenderableBoundingVolume> g_renderableBoundingVolumes : register(t1);
+StructuredBuffer<LodAndGpuSceneRenderableBoundingVolumeIndex> g_visibleRenderableBoundingVolumeIndices : register(t2);
+
+Texture2D g_depthRt : register(t0);
 
 struct Constants
 {
 	Vec4 m_color;
 	Mat4 m_viewProjMat;
-};
 
+	UVec3 m_padding;
+	U32 m_depthFailureVisualization;
+};
 ANKI_FAST_CONSTANTS(Constants, g_consts)
 
-StructuredBuffer<GpuSceneRenderableBoundingVolume> g_renderableBoundingVolumes : register(t1);
-StructuredBuffer<LodAndGpuSceneRenderableBoundingVolumeIndex> g_visibleRenderableBoundingVolumeIndices : register(t2);
-
 struct VertOut
 {
 	Vec4 m_svPosition : SV_POSITION;
@@ -77,33 +79,24 @@ VertOut main(VertIn input)
 #	endif // ANKI_VERTEX_SHADER
 
 #	if ANKI_PIXEL_SHADER
-#		include <AnKi/Shaders/ImportanceSampling.hlsl>
-
-// NOTE: Don't eliminate the binding because it confuses the descriptor set creation
-#		if DEPTH_FAIL_VISUALIZATION == 1
-SamplerState g_nearestAnyClampSampler : register(s0);
-Texture2D g_depthRt : register(t0);
-#		endif
-
 Vec4 main(VertOut input) : SV_TARGET0
 {
-	ANKI_MAYBE_UNUSED(input);
+	Vec4 col = g_consts.m_color;
 
-	// Check if we should skip the frag
-#		if DEPTH_FAIL_VISUALIZATION == 1
-	Vec2 texSize;
-	g_depthRt.GetDimensions(texSize.x, texSize.y);
-	const Vec2 uv = input.m_svPosition.xy / texSize;
-	const F32 depthRef = g_depthRt.SampleLevel(g_nearestAnyClampSampler, uv, 0.0).r;
-	const Bool depthTestFailed = input.m_svPosition.z >= depthRef;
-	if(depthTestFailed)
+	if(g_consts.m_depthFailureVisualization)
 	{
-		return g_consts.m_color * 0.5;
+		Vec2 texSize;
+		g_depthRt.GetDimensions(texSize.x, texSize.y);
+		const F32 depthRef = g_depthRt[clamp(input.m_svPosition.xy, 0.0, texSize - 1.0)].r;
+		const Bool depthTestFailed = input.m_svPosition.z >= depthRef;
+		if(depthTestFailed)
+		{
+			col.xyz *= 0.4;
+		}
 	}
-#		endif
 
 	// Write the color
-	return g_consts.m_color;
+	return col;
 }
 #	endif // ANKI_PIXEL_SHADER
 #endif // ANKI_TECHNIQUE_RenderableBoxes
@@ -122,6 +115,9 @@ struct Constants
 {
 	Mat4 m_viewProjMat;
 	Mat3x4 m_camTrf;
+
+	UVec3 m_padding;
+	U32 m_depthFailureVisualization;
 };
 
 ANKI_FAST_CONSTANTS(Constants, g_consts)
@@ -140,14 +136,19 @@ typedef GlobalIlluminationProbe ClusteredType;
 #		error See file
 #	endif
 
+Texture2D g_depthRt : register(t0);
 StructuredBuffer<ClusteredType> g_visibleObjects : register(t1);
 StructuredBuffer<U32> g_visibleObjectCount : register(t2);
+Texture2D<Vec4> g_tex : register(t3);
+Texture2D<Vec4> g_tex2 : register(t4);
+
+SamplerState g_trilinearRepeatSampler : register(s1);
 
 struct VertOut
 {
 	Vec4 m_svPosition : SV_POSITION;
 	Vec2 m_uv : TEXCOORD;
-	Vec4 m_colorScale : COLOR;
+	Vec3 m_colorScale : COLOR;
 	nointerpolation U32 m_textureIndex : TEX_INDEX;
 };
 
@@ -162,7 +163,7 @@ VertOut main(VertIn input)
 {
 	VertOut output;
 
-	output.m_colorScale = Vec4(1.0f, 1.0f, 1.0f, kAlpha);
+	output.m_colorScale = 1.0;
 	output.m_textureIndex = 0;
 
 	output.m_uv = Vec2(input.m_svVertexId & 1u, ((input.m_svVertexId + 1u) / 3u) & 1u);
@@ -173,7 +174,7 @@ VertOut main(VertIn input)
 	{
 #		if OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_LIGHT
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_position;
-		output.m_colorScale.xyz = reinhardTonemap(g_visibleObjects[input.m_svInstanceId].m_diffuseColor);
+		output.m_colorScale = reinhardTonemap(g_visibleObjects[input.m_svInstanceId].m_diffuseColor);
 		output.m_textureIndex = g_visibleObjects[input.m_svInstanceId].m_lightType;
 #		elif OBJECT_TYPE == ANKI_GPU_SCENE_NON_RENDERABLE_OBJECT_TYPE_DECAL
 		const Vec3 localPos = g_visibleObjects[input.m_svInstanceId].m_sphereCenter;
@@ -204,45 +205,37 @@ VertOut main(VertIn input)
 #	endif // ANKI_VERTEX_SHADER
 
 #	if ANKI_PIXEL_SHADER
-#		include <AnKi/Shaders/ImportanceSampling.hlsl>
-
-SamplerState g_trilinearRepeatSampler : register(s1);
-Texture2D<Vec4> g_tex : register(t3);
-Texture2D<Vec4> g_tex2 : register(t4);
-
-// NOTE: Don't eliminate the binding because it confuses the descriptor set creation
-#		if DEPTH_FAIL_VISUALIZATION == 1
-SamplerState g_nearestAnyClampSampler : register(s0);
-Texture2D g_depthRt : register(t0);
-#		endif
-
 Vec4 main(VertOut input) : SV_TARGET0
 {
 	ANKI_MAYBE_UNUSED(input);
 
-	// Check if we should skip the frag
-	F32 colorFactor = 1.0f;
-#		if DEPTH_FAIL_VISUALIZATION == 1
-	Vec2 texSize;
-	g_depthRt.GetDimensions(texSize.x, texSize.y);
-	const Vec2 uv = input.m_svPosition.xy / texSize;
-	const F32 depthRef = g_depthRt.SampleLevel(g_nearestAnyClampSampler, uv, 0.0).r;
-	const Bool depthTestFailed = input.m_svPosition.z >= depthRef;
-	if(depthTestFailed)
-	{
-		colorFactor = 0.6;
-	}
-#		endif
-
 	// Write the color
+	Vec4 color;
 	if(input.m_textureIndex == 0)
 	{
-		return g_tex.Sample(g_trilinearRepeatSampler, input.m_uv) * input.m_colorScale * colorFactor;
+		color = g_tex.Sample(g_trilinearRepeatSampler, input.m_uv);
 	}
 	else
 	{
-		return g_tex2.Sample(g_trilinearRepeatSampler, input.m_uv) * input.m_colorScale * colorFactor;
+		color = g_tex2.Sample(g_trilinearRepeatSampler, input.m_uv);
 	}
+
+	color.xyz *= input.m_colorScale;
+
+	if(g_consts.m_depthFailureVisualization)
+	{
+		Vec2 texSize;
+		g_depthRt.GetDimensions(texSize.x, texSize.y);
+
+		const F32 depthRef = g_depthRt[clamp(input.m_svPosition.xy, 0.0, texSize - 1.0)].r;
+		const Bool depthTestFailed = input.m_svPosition.z >= depthRef;
+		if(depthTestFailed)
+		{
+			color.xyz *= 0.5;
+		}
+	}
+
+	return color;
 }
 #	endif // ANKI_PIXEL_SHADER
 #endif // ANKI_TECHNIQUE_Bilboards

+ 25 - 1
AnKi/Shaders/GpuVisibilityNonRenderables.ankiprog

@@ -30,6 +30,12 @@ typedef GpuSceneGlobalIlluminationProbe ObjectType;
 #endif
 
 StructuredBuffer<ObjectType> g_objects : register(t0);
+
+#if HZB_TEST
+Texture2D g_hzbTex : register(t1);
+SamplerState g_nearestAnyClampSampler : register(s0);
+#endif
+
 RWStructuredBuffer<U32> g_visibleIndices : register(u0); // 1st element is the count. What follows is indices
 
 ANKI_FAST_CONSTANTS(GpuVisibilityNonRenderableConstants, g_consts)
@@ -90,12 +96,30 @@ Vec4 getSphere(GpuSceneGlobalIlluminationProbe l)
 
 	// Frustum test
 	//
+	Vec4 sphere = 0.0;
 	if(!skip)
 	{
-		const Vec4 sphere = getSphere(g_objects[svDispatchThreadId]);
+		sphere = getSphere(g_objects[svDispatchThreadId]);
 		skip = !frustumTest(g_consts.m_clipPlanes, sphere.xyz, sphere.w);
 	}
 
+#if HZB_TEST
+	if(!skip)
+	{
+		const Vec3 aabbMin = sphere.xyz - sphere.w;
+		const Vec3 aabbMax = sphere.xyz + sphere.w;
+
+		Vec2 minNdc, maxNdc;
+		F32 aabbMinDepth;
+		projectAabb(aabbMin, aabbMax, g_consts.m_viewProjectionMat, minNdc, maxNdc, aabbMinDepth);
+
+		if(cullHzb(minNdc, maxNdc, aabbMinDepth, g_hzbTex, g_nearestAnyClampSampler))
+		{
+			skip = true;
+		}
+	}
+#endif
+
 	// Add the object
 	//
 	if(!skip)

+ 2 - 0
AnKi/Shaders/Include/GpuVisibilityTypes.h

@@ -36,6 +36,8 @@ struct DistanceGpuVisibilityConstants
 
 struct GpuVisibilityNonRenderableConstants
 {
+	Mat4 m_viewProjectionMat;
+
 	Vec4 m_clipPlanes[6u];
 };
 

+ 0 - 2
Samples/Common/SampleApp.cpp

@@ -146,13 +146,11 @@ Error SampleApp::userMainLoop(Bool& quit, Second elapsedTime)
 		{
 			options |= DbgOption::kBoundingBoxes;
 			options |= DbgOption::kDepthTest;
-			options &= ~DbgOption::kDitheredDepthTest;
 		}
 		else
 		{
 			options |= DbgOption::kBoundingBoxes;
 			options &= ~DbgOption::kDepthTest;
-			options |= DbgOption::kDitheredDepthTest;
 		}
 
 		renderer.getDbg().setOptions(options);

+ 0 - 2
Samples/PhysicsPlayground/Main.cpp

@@ -223,13 +223,11 @@ Error MyApp::userMainLoop(Bool& quit, [[maybe_unused]] Second elapsedTime)
 		{
 			options |= DbgOption::kBoundingBoxes;
 			options |= DbgOption::kDepthTest;
-			options &= ~DbgOption::kDitheredDepthTest;
 		}
 		else
 		{
 			options |= DbgOption::kBoundingBoxes;
 			options &= ~DbgOption::kDepthTest;
-			options |= DbgOption::kDitheredDepthTest;
 		}
 
 		renderer.getDbg().setOptions(options);

+ 0 - 4
Sandbox/Main.cpp

@@ -136,13 +136,11 @@ Error MyApp::userMainLoop(Bool& quit, Second elapsedTime)
 		{
 			options |= DbgOption::kBoundingBoxes;
 			options |= DbgOption::kDepthTest;
-			options &= ~DbgOption::kDitheredDepthTest;
 		}
 		else
 		{
 			options |= DbgOption::kBoundingBoxes;
 			options &= ~DbgOption::kDepthTest;
-			options |= DbgOption::kDitheredDepthTest;
 		}
 
 		renderer.getDbg().setOptions(options);
@@ -187,13 +185,11 @@ Error MyApp::userMainLoop(Bool& quit, Second elapsedTime)
 			{
 				options |= DbgOption::kBoundingBoxes;
 				options |= DbgOption::kDepthTest;
-				options &= ~DbgOption::kDitheredDepthTest;
 			}
 			else
 			{
 				options |= DbgOption::kBoundingBoxes;
 				options &= ~DbgOption::kDepthTest;
-				options |= DbgOption::kDitheredDepthTest;
 			}
 
 			renderer.getDbg().setOptions(options);

+ 1 - 1
Tools/Editor/EditorMain.cpp

@@ -90,7 +90,7 @@ public:
 			ANKI_CHECK(ScriptManager::getSingleton().evalString(script->getSource()));
 		}
 
-		Renderer::getSingleton().getDbg().enableOptions(DbgOption::kObjectPicking);
+		Renderer::getSingleton().getDbg().enableOptions(DbgOption::kObjectPicking | DbgOption::kIcons);
 
 		return Error::kNone;
 	}