diff --git a/src/p_setup.c b/src/p_setup.c
index 37e7840784b085b4bc96f7d4a15cd976146008ee..7265f508f8fedb113108c6dc377357cbc31dbe45 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -2838,7 +2838,7 @@ boolean P_SetupLevel(boolean skipprecip)
 		savedata.lives = 0;
 	}
 
-	skyVisible = true; // assume the skybox is visible on level load.
+	skyVisible = skyVisible1 = skyVisible2 = true; // assume the skybox is visible on level load.
 	if (loadprecip) // uglier hack
 	{ // to make a newly loaded level start on the second frame.
 		INT32 buf = gametic % BACKUPTICS;
diff --git a/src/r_main.c b/src/r_main.c
index 41bdb6ef22b42ae6a1d8dfb96037b0d075c925c0..e7c37cce97938dffa7f43c098081e1b66433883a 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -67,6 +67,7 @@ fixed_t viewx, viewy, viewz;
 angle_t viewangle, aimingangle;
 fixed_t viewcos, viewsin;
 boolean viewsky, skyVisible;
+boolean skyVisible1, skyVisible2; // saved values of skyVisible for P1 and P2, for splitscreen
 sector_t *viewsector;
 player_t *viewplayer;
 
@@ -1301,6 +1302,12 @@ void R_RenderPlayerView(player_t *player)
 			V_DrawFill(0, 0, vid.width, vid.height, 128+(timeinmap&15));
 	}
 
+	// load previous saved value of skyVisible for the player
+	if (splitscreen && player == &players[secondarydisplayplayer])
+		skyVisible = skyVisible2;
+	else
+		skyVisible = skyVisible1;
+
 	portalrender = 0;
 	portal_base = portal_cap = NULL;
 
@@ -1398,6 +1405,13 @@ void R_RenderPlayerView(player_t *player)
 
 	// Check for new console commands.
 	NetUpdate();
+
+	// save value to skyVisible1 or skyVisible2
+	// this is so that P1 can't affect whether P2 can see a skybox or not, or vice versa
+	if (splitscreen && player == &players[secondarydisplayplayer])
+		skyVisible2 = skyVisible;
+	else
+		skyVisible1 = skyVisible;
 }
 
 // =========================================================================
diff --git a/src/r_state.h b/src/r_state.h
index ed04b771fade907513c5c750252ff04b8437f2d8..49d0457b262c767621dde508f85f3a481a9feb3d 100644
--- a/src/r_state.h
+++ b/src/r_state.h
@@ -85,6 +85,7 @@ extern side_t *sides;
 extern fixed_t viewx, viewy, viewz;
 extern angle_t viewangle, aimingangle;
 extern boolean viewsky, skyVisible;
+extern boolean skyVisible1, skyVisible2; // saved values of skyVisible for P1 and P2, for splitscreen
 extern sector_t *viewsector;
 extern player_t *viewplayer;
 extern UINT8 portalrender;