[Bf-blender-cvs] [92fbc818854] tmp-eevee-glsl-cleanup: Cleanup: Workbench: Remove own viewvecs

Clément Foucault noreply at git.blender.org
Sat Jul 11 14:42:18 CEST 2020


Commit: 92fbc81885445cb0e2f5b93607f3f24697e28f3e
Author: Clément Foucault
Date:   Thu Jul 9 18:41:02 2020 +0200
Branches: tmp-eevee-glsl-cleanup
https://developer.blender.org/rB92fbc81885445cb0e2f5b93607f3f24697e28f3e

Cleanup: Workbench: Remove own viewvecs

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

M	source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/shaders/common_view_lib.glsl

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
index d8cb4f86f7b..d0d52c8485b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
@@ -28,7 +28,7 @@ void cavity_compute(vec2 screenco,
     return;
   }
 
-  vec3 position = view_position_from_depth(screenco, depth, world_data.viewvecs, ProjectionMatrix);
+  vec3 position = get_view_space_from_depth(screenco, depth);
   vec3 normal = workbench_normal_decode(texture(normalBuffer, screenco));
 
   vec2 jitter_co = (screenco * world_data.viewport_size.xy) * world_data.cavity_jitter_scale;
@@ -68,8 +68,7 @@ void cavity_compute(vec2 screenco,
     bool is_background = (s_depth == 1.0);
     /* This trick provide good edge effect even if no neighbor is found. */
     s_depth = (is_background) ? depth : s_depth;
-    vec3 s_pos = view_position_from_depth(
-        uvcoords, s_depth, world_data.viewvecs, ProjectionMatrix);
+    vec3 s_pos = get_view_space_from_depth(uvcoords, s_depth);
 
     if (is_background) {
       s_pos.z -= world_data.cavity_distance;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index 25eaf003e07..e9adea50ac0 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -67,31 +67,3 @@ void workbench_float_pair_decode(float data, out float v1, out float v2)
   v1 = float(idata & v1_mask) * (1.0 / float(v1_mask));
   v2 = float(idata >> int(ROUGHNESS_BITS)) * (1.0 / float(v2_mask));
 }
-
-vec3 view_vector_from_screen_uv(vec2 uv, vec4 viewvecs[3], mat4 proj_mat)
-{
-  if (proj_mat[3][3] == 0.0) {
-    return normalize(viewvecs[0].xyz + vec3(uv, 0.0) * viewvecs[1].xyz);
-  }
-  else {
-    return vec3(0.0, 0.0, 1.0);
-  }
-}
-
-vec3 view_position_from_depth(vec2 uvcoords, float depth, vec4 viewvecs[3], mat4 proj_mat)
-{
-  if (proj_mat[3][3] == 0.0) {
-    /* Perspective */
-    float d = 2.0 * depth - 1.0;
-
-    float zview = -proj_mat[3][2] / (d + proj_mat[2][2]);
-
-    return zview * (viewvecs[0].xyz + vec3(uvcoords, 0.0) * viewvecs[1].xyz);
-  }
-  else {
-    /* Orthographic */
-    vec3 offset = vec3(uvcoords, depth);
-
-    return viewvecs[0].xyz + offset * viewvecs[1].xyz;
-  }
-}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index cdb9823096c..6e10a656fc1 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -14,7 +14,7 @@ out vec4 fragColor;
 void main()
 {
   /* Normal and Incident vector are in viewspace. Lighting is evaluated in viewspace. */
-  vec3 I = view_vector_from_screen_uv(uvcoordsvar.st, world_data.viewvecs, ProjectionMatrix);
+  vec3 I = get_view_vector_from_screen_uv(uvcoordsvar.st);
   vec3 N = workbench_normal_decode(texture(normalBuffer, uvcoordsvar.st));
   vec4 mat_data = texture(materialBuffer, uvcoordsvar.st);
 
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 5f3283e1643..a76a14fa750 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -5,7 +5,6 @@ struct LightData {
 };
 
 struct WorldData {
-  vec4 viewvecs[3];
   vec4 viewport_size;
   vec4 object_outline_color;
   vec4 shadow_direction_vs;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
index 3c2d1a9c0c7..fd4d00d96dd 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
@@ -15,7 +15,7 @@ layout(location = 1) out vec4 revealageAccum;
 layout(location = 2) out uint objectId;
 
 /* Special function only to be used with calculate_transparent_weight(). */
-float linear_zdepth(float depth, vec4 viewvecs[3], mat4 proj_mat)
+float linear_zdepth(float depth, vec4 viewvecs[2], mat4 proj_mat)
 {
   if (proj_mat[3][3] == 0.0) {
     float d = 2.0 * depth - 1.0;
@@ -33,7 +33,7 @@ float linear_zdepth(float depth, vec4 viewvecs[3], mat4 proj_mat)
  */
 float calculate_transparent_weight(void)
 {
-  float z = linear_zdepth(gl_FragCoord.z, world_data.viewvecs, ProjectionMatrix);
+  float z = linear_zdepth(gl_FragCoord.z, ViewVecs, ProjectionMatrix);
 #if 0
   /* Eq 10 : Good for surfaces with varying opacity (like particles) */
   float a = min(1.0, alpha * 10.0) + 0.01;
@@ -57,7 +57,7 @@ void main()
 {
   /* Normal and Incident vector are in viewspace. Lighting is evaluated in viewspace. */
   vec2 uv_viewport = gl_FragCoord.xy * world_data.viewport_size_inv;
-  vec3 I = view_vector_from_screen_uv(uv_viewport, world_data.viewvecs, ProjectionMatrix);
+  vec3 I = get_view_vector_from_screen_uv(uv_viewport);
   vec3 N = normalize(normal_interp);
 
   vec3 color = color_interp;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 610b5f69e58..aa938d80fa3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -190,10 +190,8 @@ void main()
 
   float depth = texelFetch(depthBuffer, ivec2(gl_FragCoord.xy), 0).r;
   float depth_end = min(depth, gl_FragCoord.z);
-  vec3 vs_ray_end = view_position_from_depth(
-      screen_uv, depth_end, world_data.viewvecs, ProjectionMatrix);
-  vec3 vs_ray_ori = view_position_from_depth(
-      screen_uv, 0.0, world_data.viewvecs, ProjectionMatrix);
+  vec3 vs_ray_end = get_view_space_from_depth(screen_uv, depth_end);
+  vec3 vs_ray_ori = get_view_space_from_depth(screen_uv, 0.0);
   vec3 vs_ray_dir = (is_persp) ? (vs_ray_end - vs_ray_ori) : vec3(0.0, 0.0, -1.0);
   vs_ray_dir /= abs(vs_ray_dir.z);
 
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 9e4d77429d5..0d7f4ee660b 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -86,43 +86,6 @@ static WORKBENCH_ViewLayerData *workbench_view_layer_data_ensure_ex(struct ViewL
 
 /* \} */
 
-static void workbench_viewvecs_update(float r_viewvecs[3][4])
-{
-  float invproj[4][4];
-  const bool is_persp = DRW_view_is_persp_get(NULL);
-  DRW_view_winmat_get(NULL, invproj, true);
-
-  /* view vectors for the corners of the view frustum.
-   * Can be used to recreate the world space position easily */
-  copy_v4_fl4(r_viewvecs[0], -1.0f, -1.0f, -1.0f, 1.0f);
-  copy_v4_fl4(r_viewvecs[1], 1.0f, -1.0f, -1.0f, 1.0f);
-  copy_v4_fl4(r_viewvecs[2], -1.0f, 1.0f, -1.0f, 1.0f);
-
-  /* convert the view vectors to view space */
-  for (int i = 0; i < 3; i++) {
-    mul_m4_v4(invproj, r_viewvecs[i]);
-    /* normalized trick see:
-     * http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
-    mul_v3_fl(r_viewvecs[i], 1.0f / r_viewvecs[i][3]);
-    if (is_persp) {
-      mul_v3_fl(r_viewvecs[i], 1.0f / r_viewvecs[i][2]);
-    }
-    r_viewvecs[i][3] = 1.0;
-  }
-
-  /* we need to store the differences */
-  r_viewvecs[1][0] -= r_viewvecs[0][0];
-  r_viewvecs[1][1] = r_viewvecs[2][1] - r_viewvecs[0][1];
-
-  /* calculate a depth offset as well */
-  if (!is_persp) {
-    float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
-    mul_m4_v4(invproj, vec_far);
-    mul_v3_fl(vec_far, 1.0f / vec_far[3]);
-    r_viewvecs[1][2] = vec_far[2] - r_viewvecs[0][2];
-  }
-}
-
 static void workbench_studiolight_data_update(WORKBENCH_PrivateData *wpd, WORKBENCH_UBO_World *wd)
 {
   StudioLight *studiolight = wpd->studio_light;
@@ -311,7 +274,6 @@ void workbench_update_world_ubo(WORKBENCH_PrivateData *wpd)
   workbench_studiolight_data_update(wpd, &wd);
   workbench_shadow_data_update(wpd, &wd);
   workbench_cavity_data_update(wpd, &wd);
-  workbench_viewvecs_update(wd.viewvecs);
 
   DRW_uniformbuffer_update(wpd->world_ubo, &wd);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index ee9960ea0ef..18ed43f7f15 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -168,7 +168,6 @@ typedef struct WORKBENCH_UBO_Material {
 } WORKBENCH_UBO_Material;
 
 typedef struct WORKBENCH_UBO_World {
-  float viewvecs[3][4];
   float viewport_size[2], viewport_size_inv[2];
   float object_outline_color[4];
   float shadow_direction_vs[4];
diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl
index ba24a50bf9f..f3929e237a4 100644
--- a/source/blender/draw/intern/shaders/common_view_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_view_lib.glsl
@@ -273,3 +273,13 @@ vec3 get_world_space_from_depth(vec2 uvcoords, float depth)
 {
   return (ViewMatrixInverse * vec4(get_view_space_from_depth(uvcoords, depth), 1.0)).xyz;
 }
+
+vec3 get_view_vector_from_screen_uv(vec2 uv)
+{
+  if (ProjectionMatrix[3][3] == 0.0) {
+    return normalize(ViewVecs[0].xyz + vec3(uv, 0.0) * ViewVecs[1].xyz);
+  }
+  else {
+    return vec3(0.0, 0.0, 1.0);
+  }
+}



More information about the Bf-blender-cvs mailing list