[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