diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c
index 63e86c7fbb0fec574d32d87afd07c2602c4b5aea..d80de8aadc349b05baff668e4a019b487cbb221b 100644
--- a/src/hardware/r_opengl/r_opengl.c
+++ b/src/hardware/r_opengl/r_opengl.c
@@ -583,6 +583,7 @@ static PFNglGetUniformLocation pglGetUniformLocation;
 static char *gl_customvertexshaders[MAXSHADERS];
 static char *gl_customfragmentshaders[MAXSHADERS];
 static GLuint gl_currentshaderprogram = 0;
+static boolean gl_shaderprogramchanged = true;
 
 // 13062019
 typedef enum
@@ -1058,8 +1059,12 @@ EXPORT void HWRAPI(SetShader) (int shader)
 #ifdef GL_SHADERS
 	if (gl_allowshaders)
 	{
+		if ((GLuint)shader != gl_currentshaderprogram)
+		{
+			gl_currentshaderprogram = shader;
+			gl_shaderprogramchanged = true;
+		}
 		gl_shadersenabled = true;
-		gl_currentshaderprogram = shader;
 		return;
 	}
 #else
@@ -1073,6 +1078,7 @@ EXPORT void HWRAPI(UnSetShader) (void)
 #ifdef GL_SHADERS
 	gl_shadersenabled = false;
 	gl_currentshaderprogram = 0;
+	pglUseProgram(0);
 #endif
 }
 
@@ -1867,7 +1873,11 @@ static void *Shader_Load(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRGBAFloat *
 		gl_shaderprogram_t *shader = &gl_shaderprograms[gl_currentshaderprogram];
 		if (shader->program)
 		{
-			pglUseProgram(gl_shaderprograms[gl_currentshaderprogram].program);
+			if (gl_shaderprogramchanged)
+			{
+				pglUseProgram(gl_shaderprograms[gl_currentshaderprogram].program);
+				gl_shaderprogramchanged = false;
+			}
 			Shader_SetUniforms(Surface, poly, tint, fade);
 			return shader;
 		}
@@ -2054,10 +2064,6 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI
 
 	if (PolyFlags & PF_ForceWrapY)
 		Clamp2D(GL_TEXTURE_WRAP_T);
-
-#ifdef GL_SHADERS
-	pglUseProgram(0);
-#endif
 }
 
 typedef struct vbo_vertex_s
@@ -2850,10 +2856,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
 		pglShadeModel(GL_FLAT);
 	}
 #endif
-
-#ifdef GL_SHADERS
-	pglUseProgram(0);
-#endif
 }
 
 // -----------------+