From 3056d55d10aa41ff05f0c9a66da2b4af48f856b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 7 Feb 2022 22:55:00 +0100 Subject: [PATCH] Fix GL errors due to disposed textures still being bound after rendering multiple projectors at once. --- .../li/cil/oc2/client/renderer/ModShaders.java | 14 ++++++++++---- .../client/renderer/ProjectorDepthRenderer.java | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/renderer/ModShaders.java b/src/main/java/li/cil/oc2/client/renderer/ModShaders.java index 2960cbd8..82a6a3c1 100644 --- a/src/main/java/li/cil/oc2/client/renderer/ModShaders.java +++ b/src/main/java/li/cil/oc2/client/renderer/ModShaders.java @@ -37,6 +37,7 @@ public static ShaderInstance getProjectorsShader() { return projectorsShader; } + @SuppressWarnings("ConstantConditions") // Setting samples to null to clear them is fine. public static void configureProjectorsShader( final RenderTarget target, final Matrix4f inverseCameraMatrix, @@ -51,10 +52,15 @@ public static void configureProjectorsShader( projectorsShader.setSampler("MainCameraDepth", target.getDepthTextureId()); projectorsShader.safeGetUniform("InverseMainCamera").set(inverseCameraMatrix); - for (int i = 0; i < projectorCount; i++) { - projectorsShader.setSampler(PROJECTOR_COLOR_NAMES[i], colors[i].getId()); - projectorsShader.setSampler(PROJECTOR_DEPTH_NAMES[i], depths[i].getDepthTextureId()); - projectorsShader.safeGetUniform(PROJECTOR_CAMERA_NAMES[i]).set(projectorCameraMatrices[i]); + for (int i = 0; i < MAX_PROJECTORS; i++) { + if (i < projectorCount) { + projectorsShader.setSampler(PROJECTOR_COLOR_NAMES[i], colors[i].getId()); + projectorsShader.setSampler(PROJECTOR_DEPTH_NAMES[i], depths[i].getDepthTextureId()); + projectorsShader.safeGetUniform(PROJECTOR_CAMERA_NAMES[i]).set(projectorCameraMatrices[i]); + } else { + projectorsShader.setSampler(PROJECTOR_COLOR_NAMES[i], null); + projectorsShader.setSampler(PROJECTOR_DEPTH_NAMES[i], null); + } } } diff --git a/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java b/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java index 1f7e0ada..0c8f4dba 100644 --- a/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java @@ -48,6 +48,7 @@ import java.time.Duration; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; @@ -181,6 +182,7 @@ public static void handleRenderLevelLast(final RenderLevelLastEvent event) { renderProjectorColors(minecraft, event.getPoseStack().last().pose(), event.getProjectionMatrix(), projectorCount); } finally { VISIBLE_PROJECTORS.clear(); + Arrays.fill(PROJECTOR_COLOR_TARGETS, null); } }