[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