[Bf-blender-cvs] [73de98e6e09] tmp-workbench-rewrite: Workbench: Refactor: Add transparent (xray) support

Clément Foucault noreply at git.blender.org
Tue Mar 3 17:35:58 CET 2020


Commit: 73de98e6e0911af26266ed14aa39bb9b94a45d8f
Author: Clément Foucault
Date:   Sun Mar 1 02:24:31 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB73de98e6e0911af26266ed14aa39bb9b94a45d8f

Workbench: Refactor: Add transparent (xray) support

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

M	source/blender/draw/CMakeLists.txt
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_prepass_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_shader_interface_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
M	source/blender/draw/engines/workbench/transparent_mode.c
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_opaque.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/engines/workbench/workbench_transparent.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index c876dd4136a..54db2655de2 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -269,10 +269,13 @@ data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC
 data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shader_interface_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_caps_geom.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_debug_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_transparent_accum_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_transparent_resolve_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_volume_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_volume_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
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 5131b9dae06..74a745ce74d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -1,13 +1,7 @@
-#define NO_OBJECT_ID uint(0)
+
 #define EPSILON 0.00001
 #define M_PI 3.14159265358979323846
 
-#ifdef GPU_VERTEX_SHADER
-#  define IN_OUT out
-#else
-#  define IN_OUT in
-#endif
-
 #define CAVITY_BUFFER_RANGE 4.0
 
 #ifdef WORKBENCH_ENCODE_NORMALS
@@ -44,75 +38,36 @@ WB_Normal workbench_normal_encode(bool front_face, vec3 n)
 #  define workbench_normal_decode(a) (a.xyz)
 #endif /* WORKBENCH_ENCODE_NORMALS */
 
-/* Encoding into the alpha of a RGBA8 UNORM texture. */
+/* Encoding into the alpha of a RGBA16F texture. (10bit mantissa) */
 #define TARGET_BITCOUNT 8u
 #define METALLIC_BITS 3u /* Metallic channel is less important. */
 #define ROUGHNESS_BITS (TARGET_BITCOUNT - METALLIC_BITS)
-#define TOTAL_BITS (METALLIC_BITS + ROUGHNESS_BITS)
 
 /* Encode 2 float into 1 with the desired precision. */
 float workbench_float_pair_encode(float v1, float v2)
 {
-  // const uint total_mask = ~(0xFFFFFFFFu << TOTAL_BITS);
   // const uint v1_mask = ~(0xFFFFFFFFu << ROUGHNESS_BITS);
   // const uint v2_mask = ~(0xFFFFFFFFu << METALLIC_BITS);
   /* Same as above because some compiler are dumb af. and think we use mediump int.  */
-  const int total_mask = 0xFF;
   const int v1_mask = 0x1F;
   const int v2_mask = 0x7;
   int iv1 = int(v1 * float(v1_mask));
   int iv2 = int(v2 * float(v2_mask)) << int(ROUGHNESS_BITS);
-  return float(iv1 | iv2) * (1.0 / float(total_mask));
+  return float(iv1 | iv2);
 }
 
 void workbench_float_pair_decode(float data, out float v1, out float v2)
 {
-  // const uint total_mask = ~(0xFFFFFFFFu << TOTAL_BITS);
   // const uint v1_mask = ~(0xFFFFFFFFu << ROUGHNESS_BITS);
   // const uint v2_mask = ~(0xFFFFFFFFu << METALLIC_BITS);
   /* Same as above because some compiler are dumb af. and think we use mediump int.  */
-  const int total_mask = 0xFF;
   const int v1_mask = 0x1F;
   const int v2_mask = 0x7;
-  int idata = int(data * float(total_mask));
+  int idata = int(data);
   v1 = float(idata & v1_mask) * (1.0 / float(v1_mask));
   v2 = float(idata >> int(ROUGHNESS_BITS)) * (1.0 / float(v2_mask));
 }
 
-float calculate_transparent_weight(float z, float alpha)
-{
-#if 0
-  /* Eq 10 : Good for surfaces with varying opacity (like particles) */
-  float a = min(1.0, alpha * 10.0) + 0.01;
-  float b = -gl_FragCoord.z * 0.95 + 1.0;
-  float w = a * a * a * 3e2 * b * b * b;
-#else
-  /* Eq 7 put more emphasis on surfaces closer to the view. */
-  // float w = 10.0 / (1e-5 + pow(abs(z) / 5.0, 2.0) + pow(abs(z) / 200.0, 6.0)); /* Eq 7 */
-  // float w = 10.0 / (1e-5 + pow(abs(z) / 10.0, 3.0) + pow(abs(z) / 200.0, 6.0)); /* Eq 8 */
-  // float w = 10.0 / (1e-5 + pow(abs(z) / 200.0, 4.0)); /* Eq 9 */
-  /* Same as eq 7, but optimized. */
-  float a = abs(z) / 5.0;
-  float b = abs(z) / 200.0;
-  b *= b;
-  float w = 10.0 / ((1e-5 + a * a) + b * (b * b)); /* Eq 7 */
-#endif
-  return alpha * clamp(w, 1e-2, 3e2);
-}
-
-/* Special function only to be used with calculate_transparent_weight(). */
-float linear_zdepth(float depth, vec4 viewvecs[3], mat4 proj_mat)
-{
-  if (proj_mat[3][3] == 0.0) {
-    float d = 2.0 * depth - 1.0;
-    return -proj_mat[3][2] / (d + proj_mat[2][2]);
-  }
-  else {
-    /* Return depth from near plane. */
-    return depth * viewvecs[1].z;
-  }
-}
-
 vec3 view_vector_from_screen_uv(vec2 uv, vec4 viewvecs[3], mat4 proj_mat)
 {
   if (proj_mat[3][3] == 0.0) {
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 915a1596180..0616043aef0 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -15,7 +15,7 @@ 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 normal = workbench_normal_decode(texture(normalBuffer, uvcoordsvar.st));
+  vec3 N = workbench_normal_decode(texture(normalBuffer, uvcoordsvar.st));
   vec4 mat_data = texture(materialBuffer, uvcoordsvar.st);
 
   vec3 base_color = mat_data.rgb;
@@ -25,17 +25,17 @@ void main()
 
 #ifdef V3D_LIGHTING_MATCAP
   /* When using matcaps, mat_data.a is the backface sign. */
-  normal = (mat_data.a > 0.0) ? normal : -normal;
+  N = (mat_data.a > 0.0) ? N : -N;
 
-  fragColor.rgb = get_matcap_lighting(base_color, normal, I);
+  fragColor.rgb = get_matcap_lighting(base_color, N, I);
 #endif
 
 #ifdef V3D_LIGHTING_STUDIO
-  fragColor.rgb = get_world_lighting(base_color, roughness, metallic, normal, I);
+  fragColor.rgb = get_world_lighting(base_color, roughness, metallic, N, I);
 #endif
 
 #ifdef V3D_LIGHTING_FLAT
-  fragColor.rgb = base_color.rgb;
+  fragColor.rgb = base_color;
 #endif
 
   fragColor.a = 1.0;
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 9e64796f757..83ee73b00d8 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -6,6 +6,7 @@ struct LightData {
 
 struct WorldData {
   vec4 viewvecs[3];
+  vec4 viewport_size;
   vec4 object_outline_color;
   vec4 shadow_direction_vs;
   LightData lights[4];
@@ -16,6 +17,8 @@ struct WorldData {
   int _pad0;
 };
 
+#define viewport_size_inv viewport_size.zw
+
 layout(std140) uniform world_block
 {
   WorldData world_data;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index e69de29bb2d..6d24b001d4d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -0,0 +1,29 @@
+
+#pragma BLENDER_REQUIRE(common_view_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_shader_interface_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_common_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_image_lib.glsl)
+
+layout(location = 0) out vec4 materialData;
+layout(location = 1) out WB_Normal normalData;
+layout(location = 2) out uint objectId;
+
+uniform bool useMatcap = false;
+
+void main()
+{
+  normalData = workbench_normal_encode(gl_FrontFacing, normal_interp);
+
+  materialData = vec4(color_interp, packed_rough_metal);
+
+  objectId = uint(object_id);
+
+  if (useMatcap) {
+    /* For matcaps, save front facing in alpha channel. */
+    materialData.a = float(gl_FrontFacing);
+  }
+
+#ifdef V3D_SHADING_TEXTURE_COLOR
+  materialData.rgb = workbench_image_color(uv_interp);
+#endif
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 5f960bdeba9..3dc4e3f5942 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -1,20 +1,10 @@
 
 #pragma BLENDER_REQUIRE(common_view_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_shader_interface_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_common_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_material_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_image_lib.glsl)
 
-IN_OUT ShaderStageInterface
-{
-  vec3 normal_interp;
-  vec3 color_interp;
-  vec2 uv_interp;
-  flat float packed_rough_metal;
-  flat int object_id;
-};
-
-#ifdef GPU_VERTEX_SHADER
-
 in vec3 pos;
 in vec3 nor;
 in vec4 ac; /* active color */
@@ -25,16 +15,16 @@ void main()
   vec3 world_pos = point_object_to_world(pos);
   gl_Position = point_world_to_ndc(world_pos);
 
-#  ifdef USE_WORLD_CLIP_PLANES
+#ifdef USE_WORLD_CLIP_PLANES
   world_clip_planes_calc_clip_distance(world_pos);
-#  endif
+#endif
 
   uv_interp = au;
 
   normal_interp = normalize(normal_object_to_view(nor));
 
-  float alpha, metallic, roughness;
-  workbench_material_data_get(resource_handle, color_interp, alpha, roughness, metallic);
+  float metallic, roughness;
+  workbench_material_data_get(resource_handle, color_interp, alpha_interp, roughness, metallic);
 
   if (materialIndex == 0) {
     color_interp = ac.rgb;
@@ -44,31 +34,3 @@ void main()
 
   object_id = int((uint(resource_id) + 1u) & 0xFFu);
 }
-
-#else
-
-layout(location = 0) out vec4 materialData;
-layout(location = 1) out WB_Normal normalData;
-layout(location = 2) out uint objec

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list