[Bf-blender-cvs] [d2c94c7873] blender2.8: New Grid: Fix depth fighting and remove some unused variables.

Clément Foucault noreply at git.blender.org
Sat Mar 25 19:56:53 CET 2017


Commit: d2c94c78736e84c1318859c8e902b3ee622fd6f0
Author: Clément Foucault
Date:   Sat Mar 25 19:02:04 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBd2c94c78736e84c1318859c8e902b3ee622fd6f0

New Grid: Fix depth fighting and remove some unused variables.

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

M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/shaders/object_grid_frag.glsl
M	source/blender/draw/modes/shaders/object_grid_vert.glsl

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

diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 40fabe0404..bf431a6172 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -163,6 +163,7 @@ static struct {
 	struct GPUShader *grid_sh;
 	float camera_pos[3];
 	float grid_settings[4];
+	float grid_mat[4][4];
 } e_data = {NULL}; /* Engine data */
 
 /* *********** FUNCTIONS *********** */
@@ -205,10 +206,13 @@ static void OBJECT_engine_init(void)
 	}
 
 	{
+		float viewinvmat[4][4], winmat[4][4], viewmat[4][4];
+		DRW_viewport_matrix_get(winmat, DRW_MAT_WIN);
+		DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW);
+		DRW_viewport_matrix_get(viewinvmat, DRW_MAT_VIEWINV);
+
 		/* Setup camera pos */
-		float viewmat[4][4];
-		DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEWINV);
-		copy_v3_v3(e_data.camera_pos, viewmat[3]);
+		copy_v3_v3(e_data.camera_pos, viewinvmat[3]);
 
 		/* grid settings */
 		const bContext *C = DRW_get_context();
@@ -219,6 +223,20 @@ static void OBJECT_engine_init(void)
 		e_data.grid_settings[1] = 2.0f; /* gridResolution */
 		e_data.grid_settings[2] = ED_view3d_grid_scale(scene, v3d, NULL); /* gridScale */
 		e_data.grid_settings[3] = v3d->gridsubdiv; /* gridSubdiv */
+
+		/* Grid matrix polygon offset (fix depth fighting) */
+		/* see ED_view3d_polygon_offset */
+		float offs;
+		if (winmat[3][3] > 0.5f) {
+			float viewdist = 1.0f / max_ff(fabsf(winmat[0][0]), fabsf(winmat[1][1]));
+			offs = 0.00001f * viewdist;
+		}
+		else {
+			offs = winmat[3][2] * -0.0025f;
+		}
+		winmat[3][2] -= offs;
+
+		mul_m4_m4m4(e_data.grid_mat, winmat, viewmat);
 	}
 }
 
@@ -365,6 +383,7 @@ static void OBJECT_cache_init(void)
 		struct Batch *quad = DRW_cache_fullscreen_quad_get();
 
 		DRWShadingGroup *grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);
+		DRW_shgroup_uniform_mat4(grp, "ViewProjectionOffsetMatrix", (float *)e_data.grid_mat);
 		DRW_shgroup_uniform_vec3(grp, "cameraPos", e_data.camera_pos, 1);
 		DRW_shgroup_uniform_vec4(grp, "gridSettings", e_data.grid_settings, 1);
 		DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo, 0);
diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl
index e4fba09c80..0f7be9fea3 100644
--- a/source/blender/draw/modes/shaders/object_grid_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_frag.glsl
@@ -3,7 +3,6 @@
  * Clément Foucault */
 
 in vec3 wPos;
-in float viewDist;
 
 out vec4 FragColor;
 
diff --git a/source/blender/draw/modes/shaders/object_grid_vert.glsl b/source/blender/draw/modes/shaders/object_grid_vert.glsl
index ef457c0128..3c6f0a3bd2 100644
--- a/source/blender/draw/modes/shaders/object_grid_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_vert.glsl
@@ -2,18 +2,15 @@
 /* Infinite grid
  * Clément Foucault */
 
-uniform mat4 ViewProjectionMatrix;
-uniform mat4 ViewMatrix;
+uniform mat4 ViewProjectionOffsetMatrix;
 
 in vec3 pos;
 
 out vec3 wPos;
-out float viewDist;
 
 void main()
 {
 	vec3 realPos = pos * 1e3;
-	gl_Position = ViewProjectionMatrix * vec4(realPos, 1.0);
-	viewDist = -(ViewMatrix * vec4(realPos, 1.0)).z;
+	gl_Position = ViewProjectionOffsetMatrix * vec4(realPos, 1.0);
 	wPos = realPos;
 }




More information about the Bf-blender-cvs mailing list