[Bf-blender-cvs] [5d6e9f237b] blender2.8: OpenGL: viewport background & depth buffer fixes

Mike Erwin noreply at git.blender.org
Thu Mar 23 21:30:09 CET 2017


Commit: 5d6e9f237be3379b63169f86b8f4117752d095b3
Author: Mike Erwin
Date:   Thu Mar 23 16:27:57 2017 -0400
Branches: blender2.8
https://developer.blender.org/rB5d6e9f237be3379b63169f86b8f4117752d095b3

OpenGL: viewport background & depth buffer fixes

Untangling some of the logic in view3d_draw.

===================================================================

M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_draw_legacy.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 33448a577a..808a5f3429 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -814,8 +814,6 @@ static void view3d_draw_background_gradient(void)
 {
 	/* TODO: finish 2D API & draw background with that */
 
-	glClear(GL_DEPTH_BUFFER_BIT);
-
 	VertexFormat *format = immVertexFormat();
 	unsigned pos = add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
 	unsigned color = add_attrib(format, "color", COMP_U8, 3, NORMALIZE_INT_TO_FLOAT);
@@ -826,7 +824,7 @@ static void view3d_draw_background_gradient(void)
 	UI_GetThemeColor3ubv(TH_LOW_GRAD, col_lo);
 	UI_GetThemeColor3ubv(TH_HIGH_GRAD, col_hi);
 
-	immBegin(GL_QUADS, 4);
+	immBegin(PRIM_TRIANGLE_FAN, 4);
 	immAttrib3ubv(color, col_lo);
 	immVertex2f(pos, -1.0f, -1.0f);
 	immVertex2f(pos, 1.0f, -1.0f);
@@ -841,13 +839,8 @@ static void view3d_draw_background_gradient(void)
 
 static void view3d_draw_background_none(void)
 {
-	if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
-		view3d_draw_background_gradient();
-	}
-	else {
-		UI_ThemeClearColorAlpha(TH_HIGH_GRAD, 1.0f);
-		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-	}
+	UI_ThemeClearColorAlpha(TH_HIGH_GRAD, 1.0f);
+	glClear(GL_COLOR_BUFFER_BIT);
 }
 
 static void view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D *rv3d)
@@ -859,9 +852,6 @@ static void view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D
 		GPU_material_bind(gpumat, 1, 1, 1.0f, false, rv3d->viewmat, rv3d->viewinv, rv3d->viewcamtexcofac, (v3d->scenelock != 0));
 
 		if (GPU_material_bound(gpumat)) {
-
-			glClear(GL_DEPTH_BUFFER_BIT);
-
 			/* TODO viewport (dfelinto): GPU_material_bind relies on immediate mode,
 			* we can't get rid of the following code without a bigger refactor
 			* or we dropping this functionality. */
@@ -874,14 +864,12 @@ static void view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D
 			glEnd();
 
 			GPU_material_unbind(gpumat);
+			return;
 		}
-		else {
-			view3d_draw_background_none();
-		}
-	}
-	else {
-		view3d_draw_background_none();
 	}
+
+	/* if any of the above fails */
+	view3d_draw_background_none();
 }
 
 /* ******************** solid plates ***************** */
@@ -895,11 +883,8 @@ static void view3d_draw_background(const bContext *C)
 	View3D *v3d = CTX_wm_view3d(C);
 	RegionView3D *rv3d = CTX_wm_region_view3d(C);
 
-	glDisable(GL_DEPTH_TEST);
-	glDepthMask(GL_TRUE);
 	/* Background functions do not read or write depth, but they do clear or completely
-	 * overwrite color buffer. It's more efficient to clear color & depth in once call, so
-	 * background functions do this even though they don't use depth.
+	 * overwrite color buffer.
 	 */
 
 	switch (v3d->debug.background) {
@@ -912,7 +897,6 @@ static void view3d_draw_background(const bContext *C)
 		case V3D_DEBUG_BACKGROUND_NONE:
 		default:
 			view3d_draw_background_none();
-			break;
 	}
 }
 
@@ -2139,7 +2123,6 @@ static void view3d_draw_solid_plates(const bContext *C, ARegion *ar, DrawData *d
 {
 	/* realtime plates */
 	if ((!draw_data->is_render) || draw_data->clip_border) {
-		view3d_draw_background(C);
 		view3d_draw_render_solid_surfaces(C, ar, true);
 		view3d_draw_render_transparent_surfaces(C);
 		view3d_draw_post_draw(C);
@@ -2183,7 +2166,6 @@ static void view3d_draw_non_meshes(const bContext *C, ARegion *ar)
 	                        ((v3d->drawtype == OB_RENDER) && (v3d->prev_drawtype == OB_BOUNDBOX)));
 
 	glEnable(GL_DEPTH_TEST);
-	glDepthMask(GL_TRUE);
 	/* TODO Viewport
 	 * we are already temporarily writing to zbuffer in draw_object()
 	 * for now let's avoid writing again to zbuffer to prevent glitches
@@ -2199,7 +2181,6 @@ static void view3d_draw_non_meshes(const bContext *C, ARegion *ar)
 		}
 	}
 
-	glDepthMask(GL_FALSE);
 	glDisable(GL_DEPTH_TEST);
 }
 
@@ -2309,15 +2290,39 @@ static void view3d_draw_view(const bContext *C, ARegion *ar, DrawData *draw_data
 	/* TODO - Technically this should be drawn to a few FBO, so we can handle
 	 * compositing better, but for now this will get the ball rolling (dfelinto) */
 
+	glDepthMask(GL_TRUE); /* should be set by default */
+	glClear(GL_DEPTH_BUFFER_BIT);
+//	glDisable(GL_DEPTH_TEST); /* should be set by default */
+
+	glMatrixMode(GL_PROJECTION);
+	gpuLoadIdentity();
+	glMatrixMode(GL_MODELVIEW);
+	gpuLoadIdentity();
+
+	view3d_draw_background(C); /* clears/overwrites entire color buffer */
+
 	view3d_draw_setup_view(C, ar);
-	view3d_draw_prerender_buffers(C, ar, draw_data);
+
+	glEnable(GL_DEPTH_TEST);
+	glDepthFunc(GL_LEQUAL);
+	view3d_draw_prerender_buffers(C, ar, draw_data); /* depth pre-pass */
+
+//	glDepthFunc(GL_EQUAL); /* TODO: do this after separating surfaces from wires */
+//	glDepthMask(GL_FALSE); /* TODO: do this after separating surfaces from wires */
 	view3d_draw_solid_plates(C, ar, draw_data);
+
+//	glDepthFunc(GL_LEQUAL); /* same TODO as above */
+//	glDepthMask(GL_TRUE); /* same TODO as above */
+
 	view3d_draw_geometry_overlay(C);
 	view3d_draw_non_meshes(C, ar);
 	view3d_draw_other_elements(C, ar);
 	view3d_draw_tool_ui(C);
 	view3d_draw_reference_images(C);
 	view3d_draw_manipulator(C);
+
+	glDisable(GL_DEPTH_TEST);
+
 	view3d_draw_region_info(C, ar);
 
 #if VIEW3D_DRAW_DEBUG
@@ -2437,7 +2442,12 @@ void VP_drawrenderborder(ARegion *ar, View3D *v3d)
 
 void VP_view3d_draw_background_none(void)
 {
-	view3d_draw_background_none();
+	if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
+		view3d_draw_background_gradient();
+	}
+	else {
+		view3d_draw_background_none();
+	}
 }
 
 void VP_view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D *rv3d)
diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c
index 3ea3214231..27e4dec9d2 100644
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@ -1178,7 +1178,7 @@ float view3d_depth_near(ViewDepths *d)
 
 void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
 {
-	short zbuf = v3d->zbuf;
+	bool zbuf = v3d->zbuf;
 	RegionView3D *rv3d = ar->regiondata;
 
 	view3d_winmatrix_set(ar, v3d, NULL);
@@ -1198,8 +1198,9 @@ void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
 	if (v3d->flag2 & V3D_SHOW_GPENCIL) {
 		ED_gpencil_draw_view3d(NULL, scene, v3d, ar, true);
 	}
-	
+
 	v3d->zbuf = zbuf;
+	if (!zbuf) glDisable(GL_DEPTH_TEST);
 }
 
 void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaoverride)
@@ -1774,11 +1775,20 @@ void ED_view3d_draw_offscreen_init(Scene *scene, SceneLayer *sl, View3D *v3d)
  */
 static void view3d_main_region_clear(Scene *scene, View3D *v3d, ARegion *ar)
 {
+	glClear(GL_DEPTH_BUFFER_BIT);
+
+	glMatrixMode(GL_PROJECTION);
+	gpuLoadIdentity();
+	glMatrixMode(GL_MODELVIEW);
+	gpuLoadIdentity();
+
 	if (scene->world && (v3d->flag3 & V3D_SHOW_WORLD)) {
 		VP_view3d_draw_background_world(scene, v3d, ar->regiondata);
 	}
 	else {
 		VP_view3d_draw_background_none();
+
+	glEnable(GL_DEPTH_TEST);
 	}
 }
 
@@ -2410,9 +2420,6 @@ static void view3d_main_region_draw_objects(const bContext *C, Scene *scene, Sce
 		do_compositing = GPU_fx_compositor_initialize_passes(rv3d->compositor, &ar->winrct, &ar->drawrct, &fx_settings);
 	}
 	
-	/* clear the background */
-	view3d_main_region_clear(scene, v3d, ar);
-
 	/* enables anti-aliasing for 3D view drawing */
 	if (win->multisamples != USER_MULTISAMPLE_NONE) {
 		glEnable(GL_MULTISAMPLE);
@@ -2524,18 +2531,20 @@ void view3d_main_region_draw_legacy(const bContext *C, ARegion *ar)
 
 	/* draw viewport using opengl */
 	if (v3d->drawtype != OB_RENDER || !view3d_main_region_do_render_draw(scene) || clip_border) {
+		view3d_main_region_clear(scene, v3d, ar); /* background */
 		view3d_main_region_draw_objects(C, scene, sl, v3d, ar, &grid_unit);
 
 		if (G.debug & G_DEBUG_SIMDATA)
 			draw_sim_debug_data(scene, v3d, ar);
-		
+
+		glDisable(GL_DEPTH_TEST);
 		ED_region_pixelspace(ar);
 	}
 
 	/* draw viewport using external renderer */
 	if (v3d->drawtype == OB_RENDER)
 		view3d_main_region_draw_engine(C, scene, ar, v3d, clip_border, &border_rect);
-	
+
 	view3d_main_region_draw_info(C, scene, ar, v3d, grid_unit, render_border);
 
 	v3d->flag |= V3D_INVALID_BACKBUF;




More information about the Bf-blender-cvs mailing list