[Bf-blender-cvs] [f1a5fd90bad] blender2.8: Shader Node Editor: Add Closure to RGB convertion node.

Clément Foucault noreply at git.blender.org
Wed May 16 16:58:39 CEST 2018


Commit: f1a5fd90bad851ccb9eef7bc59c3a8ebe39fe8b8
Author: Clément Foucault
Date:   Mon May 14 13:34:54 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf1a5fd90bad851ccb9eef7bc59c3a8ebe39fe8b8

Shader Node Editor: Add Closure to RGB convertion node.

Patch D3205 by Kanzaki Wataru

Only implemented in Eevee for now. Collapse a closure to RGBA so we can
do NPR stuff on the resulting color.

Use an emission shader to convert the color back to a closure.

Doing this will break PBR and will kill any SSR and SSS effects the shader
the shader rely on. That said screen space refraction and ambient occlusion
are supported due to the way they are implemented.

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.c
M	source/blender/draw/engines/eevee/eevee_screen_raytrace.c
M	source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_shader.h
M	source/blender/nodes/NOD_static_types.h
A	source/blender/nodes/shader/nodes/node_shader_shaderToRgb.c

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 0d283d39af7..135c4b68f18 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -253,6 +253,7 @@ shader_node_categories = [
         NodeItem("ShaderNodeMath"),
         NodeItem("ShaderNodeValToRGB"),
         NodeItem("ShaderNodeRGBToBW"),
+        NodeItem("ShaderNodeShaderToRGB", poll=object_eevee_shader_nodes_poll),
         NodeItem("ShaderNodeVectorMath"),
         NodeItem("ShaderNodeSeparateRGB"),
         NodeItem("ShaderNodeCombineRGB"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index d85f4095eb9..f3cbcd7b99f 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -714,6 +714,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, c
 #define SH_NODE_MIX_RGB		103
 #define SH_NODE_VALTORGB	104
 #define SH_NODE_RGBTOBW		105
+#define SH_NODE_SHADERTORGB	106
 //#define SH_NODE_TEXTURE		106
 #define SH_NODE_NORMAL		107
 //#define SH_NODE_GEOMETRY	108
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 3b51ce9366f..d86b73ab1a9 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3473,6 +3473,7 @@ static void registerShaderNodes(void)
 	register_node_type_sh_mix_rgb();
 	register_node_type_sh_valtorgb();
 	register_node_type_sh_rgbtobw();
+	register_node_type_sh_shadertorgb();
 	register_node_type_sh_normal();
 	register_node_type_sh_mapping();
 	register_node_type_sh_curve_vec();
diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
index 56cc905d701..87395f94fbb 100644
--- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
+++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
@@ -68,9 +68,9 @@ static struct GPUShader *eevee_effects_screen_raytrace_shader_get(int options)
 		        datatoc_common_uniforms_lib_glsl,
 		        datatoc_bsdf_common_lib_glsl,
 		        datatoc_bsdf_sampling_lib_glsl,
+		        datatoc_ambient_occlusion_lib_glsl,
 		        datatoc_octahedron_lib_glsl,
 		        datatoc_lightprobe_lib_glsl,
-		        datatoc_ambient_occlusion_lib_glsl,
 		        datatoc_raytrace_lib_glsl,
 		        datatoc_effect_ssr_frag_glsl);
 
diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
index 6c21d7d6fef..0f76f8e1b8c 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -2,12 +2,6 @@
 /* Based on Stochastic Screen Space Reflections
  * https://www.ea.com/frostbite/news/stochastic-screen-space-reflections */
 
-#ifndef UTIL_TEX
-#define UTIL_TEX
-uniform sampler2DArray utilTex;
-#define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0)
-#endif /* UTIL_TEX */
-
 #define MAX_MIP 9.0
 
 uniform ivec2 halfresOffset;
@@ -183,40 +177,6 @@ const ivec2 neighbors[32] = ivec2[32](
 
 out vec4 fragColor;
 
-void fallback_cubemap(
-        vec3 N, vec3 V, vec3 W, vec3 viewPosition, float roughness, float roughnessSquared, inout vec4 spec_accum)
-{
-	/* Specular probes */
-	vec3 spec_dir = get_specular_reflection_dominant_dir(N, V, roughnessSquared);
-
-	vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy);
-	vec3 bent_normal;
-#ifdef SSR_AO
-	float final_ao = occlusion_compute(N, viewPosition, 1.0, rand, bent_normal);
-	final_ao = specular_occlusion(dot(N, V), final_ao, roughness);
-#else
-	const float final_ao = 1.0;
-#endif
-
-	/* Starts at 1 because 0 is world probe */
-	for (int i = 1; i < MAX_PROBE && i < prbNumRenderCube && spec_accum.a < 0.999; ++i) {
-		CubeData cd = probes_data[i];
-
-		float fade = probe_attenuation_cube(cd, W);
-
-		if (fade > 0.0) {
-			vec3 spec = final_ao * probe_evaluate_cube(float(i), cd, W, spec_dir, roughness);
-			accumulate_light(spec, fade, spec_accum);
-		}
-	}
-
-	/* World Specular */
-	if (spec_accum.a < 0.999) {
-		vec3 spec = final_ao * probe_evaluate_world_spec(spec_dir, roughness);
-		accumulate_light(spec, 1.0, spec_accum);
-	}
-}
-
 #if 0 /* Finish reprojection with motion vectors */
 vec3 get_motion_vector(vec3 pos)
 {
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
index 429f6ea92e4..6c1571d5306 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
@@ -72,6 +72,12 @@ struct GridData {
 #define MAX_PLANAR 1
 #endif
 
+#ifndef UTIL_TEX
+#define UTIL_TEX
+uniform sampler2DArray utilTex;
+#define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0)
+#endif /* UTIL_TEX */
+
 layout(std140) uniform probe_block {
 	CubeData probes_data[MAX_PROBE];
 };
@@ -196,6 +202,40 @@ vec3 probe_evaluate_planar(
 	return sample;
 }
 
+void fallback_cubemap(
+        vec3 N, vec3 V, vec3 W, vec3 viewPosition, float roughness, float roughnessSquared, inout vec4 spec_accum)
+{
+	/* Specular probes */
+	vec3 spec_dir = get_specular_reflection_dominant_dir(N, V, roughnessSquared);
+
+	vec4 rand = texelfetch_noise_tex(gl_FragCoord.xy);
+	vec3 bent_normal;
+#ifdef SSR_AO
+	float final_ao = occlusion_compute(N, viewPosition, 1.0, rand, bent_normal);
+	final_ao = specular_occlusion(dot(N, V), final_ao, roughness);
+#else
+	const float final_ao = 1.0;
+#endif
+
+	/* Starts at 1 because 0 is world probe */
+	for (int i = 1; i < MAX_PROBE && i < prbNumRenderCube && spec_accum.a < 0.999; ++i) {
+		CubeData cd = probes_data[i];
+
+		float fade = probe_attenuation_cube(cd, W);
+
+		if (fade > 0.0) {
+			vec3 spec = final_ao * probe_evaluate_cube(float(i), cd, W, spec_dir, roughness);
+			accumulate_light(spec, fade, spec_accum);
+		}
+	}
+
+	/* World Specular */
+	if (spec_accum.a < 0.999) {
+		vec3 spec = final_ao * probe_evaluate_world_spec(spec_dir, roughness);
+		accumulate_light(spec, 1.0, spec_accum);
+	}
+}
+
 #ifdef IRRADIANCE_LIB
 vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos)
 {
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 45701f090fa..236eddbb63f 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -2544,4 +2544,28 @@ void node_eevee_specular(
 	result.ssr_id = int(ssr_id);
 }
 
+void node_shadertorgb(Closure cl, out vec4 outcol, out float outalpha)
+{
+	vec4 spec_accum = vec4(0.0);
+	if (ssrToggle && cl.ssr_id == outputSsrId) {
+		vec3 V = cameraVec;
+		vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec);
+		vec3 N = transform_direction(ViewMatrixInverse, vN);
+		float roughness = cl.ssr_data.a;
+		float roughnessSquared = max(1e-3, roughness * roughness);
+		fallback_cubemap(N, V, worldPosition, viewPosition, roughness, roughnessSquared, spec_accum);
+	}
+
+	outalpha = cl.opacity;
+	outcol = vec4((spec_accum.rgb * cl.ssr_data.rgb) + cl.radiance, 1.0);
+
+#   ifdef USE_SSS
+#		ifdef USE_SSS_ALBEDO
+	outcol += (cl.sss_data * cl.sss_albedo);
+#   	else
+	outcol += cl.sss_data;
+#		endif
+#	endif
+}
+
 #endif /* VOLUMETRICS */
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index efe7db088f8..5acd0a9fcea 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -177,6 +177,7 @@ set(SRC
 	shader/nodes/node_shader_light_falloff.c
 	shader/nodes/node_shader_light_path.c
 	shader/nodes/node_shader_mix_shader.c
+	shader/nodes/node_shader_shaderToRgb.c
 	shader/nodes/node_shader_normal_map.c
 	shader/nodes/node_shader_object_info.c
 	shader/nodes/node_shader_hair_info.c
diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h
index e411ceb6a23..3d6a8647628 100644
--- a/source/blender/nodes/NOD_shader.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -50,6 +50,7 @@ void register_node_type_sh_rgb(void);
 void register_node_type_sh_mix_rgb(void);
 void register_node_type_sh_valtorgb(void);
 void register_node_type_sh_rgbtobw(void);
+void register_node_type_sh_shadertorgb(void);
 void register_node_type_sh_normal(void);
 void register_node_type_sh_gamma(void);
 void register_node_type_sh_brightcontrast(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 299c3a627ee..efb8eb66737 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -45,6 +45,7 @@ DefNode( ShaderNode,     SH_NODE_VALUE,           0,                      "VALUE
 DefNode( ShaderNode,     SH_NODE_MIX_RGB,         def_mix_rgb,            "MIX_RGB",        MixRGB,           "MixRGB",            ""              )
 DefNode( ShaderNode,     SH_NODE_VALTORGB,        def_colorramp,          "VALTORGB",       ValToRGB,         "ColorRamp",         ""              )
 DefNode( ShaderNode,     SH_NODE_RGBTOBW,         0,                      "RGBTOBW",        RGBToBW,          "RGB to BW",         ""              )
+DefNode( ShaderNode,     SH_NODE_SHADERTORGB,     0,                      "SHADERTORGB",    ShaderToRGB,      "Shader to RGB",     ""              )
 DefNode( ShaderNode,     SH_NODE_NORMAL,          0,                      "NORMAL",         Normal,           "Normal",            ""              )
 DefNode( ShaderNode,     SH_NODE_GAMMA,           0,                      "GAMMA",          Gamma,            "Gamma",             ""              )
 DefNode( ShaderNode,     SH_NODE_BRIGHTCONTRAST,  0,                      "BRIGHTCONTRAST", BrightContrast,   "Bright Contrast",   ""              )
diff --git a/source/blender/nodes/shader/nodes/node_shader_shaderToRgb.c b/source/blender/nodes/shader/nodes/node_shader_shaderToRgb.c
new file mode 100644
index 00000000000..286752f9a10
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_shaderToRgb.c
@@ -0,0 +1,61 @@
+/*
+ * ***** BEGIN GPL LIC

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list