[Bf-blender-cvs] [b248ec97769] master: Shaders: add emission strength input to Principled BSDF node

Alex Strand noreply at git.blender.org
Thu Sep 17 18:55:01 CEST 2020


Commit: b248ec97769fa654a3ee8bb2a643046b79e7c030
Author: Alex Strand
Date:   Wed Sep 9 11:36:57 2020 +0200
Branches: master
https://developer.blender.org/rBb248ec97769fa654a3ee8bb2a643046b79e7c030

Shaders: add emission strength input to Principled BSDF node

This impacts I/O add-ons. OBJ, FBX and Collada have been updated, glTF not yet.

Differential Revision: https://developer.blender.org/D4971

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

M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	release/scripts/modules/bpy_extras/node_shader_utils.py
M	source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
M	source/blender/io/collada/Materials.cpp
M	source/blender/io/collada/collada_utils.cpp
M	source/blender/io/collada/collada_utils.h
M	source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c

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

diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index de32ce53ad7..fc525e06d1e 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -2755,6 +2755,7 @@ NODE_DEFINE(PrincipledBsdfNode)
   SOCKET_IN_FLOAT(transmission_roughness, "Transmission Roughness", 0.0f);
   SOCKET_IN_FLOAT(anisotropic_rotation, "Anisotropic Rotation", 0.0f);
   SOCKET_IN_COLOR(emission, "Emission", make_float3(0.0f, 0.0f, 0.0f));
+  SOCKET_IN_FLOAT(emission_strength, "Emission Strength", 1.0f);
   SOCKET_IN_FLOAT(alpha, "Alpha", 1.0f);
   SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
   SOCKET_IN_NORMAL(clearcoat_normal,
@@ -2781,7 +2782,9 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph)
   ShaderOutput *principled_out = output("BSDF");
 
   ShaderInput *emission_in = input("Emission");
-  if (emission_in->link || emission != make_float3(0.0f, 0.0f, 0.0f)) {
+  ShaderInput *emission_strength_in = input("Emission Strength");
+  if ((emission_in->link || emission != make_float3(0.0f, 0.0f, 0.0f)) &&
+      (emission_strength_in->link || emission_strength != 0.0f)) {
     /* Create add closure and emission. */
     AddClosureNode *add = graph->create_node<AddClosureNode>();
     EmissionNode *emission_node = graph->create_node<EmissionNode>();
@@ -2790,7 +2793,7 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph)
     graph->add(add);
     graph->add(emission_node);
 
-    emission_node->strength = 1.0f;
+    graph->relink(emission_strength_in, emission_node->input("Strength"));
     graph->relink(emission_in, emission_node->input("Color"));
     graph->relink(principled_out, new_out);
     graph->connect(emission_node->output("Emission"), add->input("Closure1"));
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 59e00231c2c..62dd9d843a8 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -580,6 +580,7 @@ class PrincipledBsdfNode : public BsdfBaseNode {
   ClosureType distribution, distribution_orig;
   ClosureType subsurface_method;
   float3 emission;
+  float emission_strength;
   float alpha;
 
   bool has_integrator_dependency();
diff --git a/release/scripts/modules/bpy_extras/node_shader_utils.py b/release/scripts/modules/bpy_extras/node_shader_utils.py
index 81c7fa31379..bcb8adff910 100644
--- a/release/scripts/modules/bpy_extras/node_shader_utils.py
+++ b/release/scripts/modules/bpy_extras/node_shader_utils.py
@@ -505,7 +505,7 @@ class PrincipledBSDFWrapper(ShaderWrapper):
     @_set_check
     def emission_color_set(self, color):
         if self.use_nodes and self.node_principled_bsdf is not None:
-            color = values_clamp(color, 0.0, 1.0)
+            color = values_clamp(color, 0.0, 1000000.0)
             color = rgb_to_rgba(color)
             self.node_principled_bsdf.inputs["Emission"].default_value = color
 
@@ -523,6 +523,31 @@ class PrincipledBSDFWrapper(ShaderWrapper):
 
     emission_color_texture = property(emission_color_texture_get)
 
+    def emission_strength_get(self):
+        if not self.use_nodes or self.node_principled_bsdf is None:
+            return 1.0
+        return self.node_principled_bsdf.inputs["Emission Strength"].default_value
+
+    @_set_check
+    def emission_strength_set(self, value):
+        value = values_clamp(value, 0.0, 1000000.0)
+        if self.use_nodes and self.node_principled_bsdf is not None:
+            self.node_principled_bsdf.inputs["Emission Strength"].default_value = value
+
+    emission_strength = property(emission_strength_get, emission_strength_set)
+
+
+    def emission_strength_texture_get(self):
+        if not self.use_nodes or self.node_principled_bsdf is None:
+            return None
+        return ShaderImageTextureWrapper(
+            self, self.node_principled_bsdf,
+            self.node_principled_bsdf.inputs["Emission Strength"],
+            grid_row_diff=-1,
+            colorspace_name='Non-Color',
+        )
+
+    emission_strength_texture = property(emission_strength_texture_get)
 
     # --------------------------------------------------------------------
     # Normal map.
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
index 80ed4e1ef69..1f5851c17d2 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl
@@ -54,6 +54,7 @@ void node_bsdf_principled(vec4 base_color,
                           float transmission,
                           float transmission_roughness,
                           vec4 emission,
+                          float emission_strength,
                           float alpha,
                           vec3 N,
                           vec3 CN,
@@ -134,7 +135,7 @@ void node_bsdf_principled(vec4 base_color,
   result.radiance += render_pass_glossy_mask(spec_col, out_spec);
   /* Coarse approx. */
   result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color);
-  result.radiance += render_pass_emission_mask(emission.rgb);
+  result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
   result.radiance *= alpha;
   closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
 
@@ -161,6 +162,7 @@ void node_bsdf_principled_dielectric(vec4 base_color,
                                      float transmission,
                                      float transmission_roughness,
                                      vec4 emission,
+                                     float emission_strength,
                                      float alpha,
                                      vec3 N,
                                      vec3 CN,
@@ -193,7 +195,7 @@ void node_bsdf_principled_dielectric(vec4 base_color,
   result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec);
   result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color);
   result.radiance += render_pass_diffuse_mask(diffuse, out_diff * diffuse);
-  result.radiance += render_pass_emission_mask(emission.rgb);
+  result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
   result.radiance *= alpha;
   closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
 
@@ -218,6 +220,7 @@ void node_bsdf_principled_metallic(vec4 base_color,
                                    float transmission,
                                    float transmission_roughness,
                                    vec4 emission,
+                                   float emission_strength,
                                    float alpha,
                                    vec3 N,
                                    vec3 CN,
@@ -238,7 +241,7 @@ void node_bsdf_principled_metallic(vec4 base_color,
 
   result = CLOSURE_DEFAULT;
   result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec);
-  result.radiance += render_pass_emission_mask(emission.rgb);
+  result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
   result.radiance *= alpha;
   closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
 
@@ -263,6 +266,7 @@ void node_bsdf_principled_clearcoat(vec4 base_color,
                                     float transmission,
                                     float transmission_roughness,
                                     vec4 emission,
+                                    float emission_strength,
                                     float alpha,
                                     vec3 N,
                                     vec3 CN,
@@ -295,7 +299,7 @@ void node_bsdf_principled_clearcoat(vec4 base_color,
 
   result = CLOSURE_DEFAULT;
   result.radiance = render_pass_glossy_mask(vec3(spec_col), out_spec);
-  result.radiance += render_pass_emission_mask(emission.rgb);
+  result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
   result.radiance *= alpha;
 
   closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
@@ -321,6 +325,7 @@ void node_bsdf_principled_subsurface(vec4 base_color,
                                      float transmission,
                                      float transmission_roughness,
                                      vec4 emission,
+                                     float emission_strength,
                                      float alpha,
                                      vec3 N,
                                      vec3 CN,
@@ -365,7 +370,7 @@ void node_bsdf_principled_subsurface(vec4 base_color,
   result = CLOSURE_DEFAULT;
   result.radiance = render_pass_glossy_mask(vec3(1.0), out_spec);
   result.radiance += render_pass_diffuse_mask(sheen_color, out_diff * out_sheen * sheen_color);
-  result.radiance += render_pass_emission_mask(emission.rgb);
+  result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
   result.radiance *= alpha;
 
   closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
@@ -394,6 +399,7 @@ void node_bsdf_principled_glass(vec4 base_color,
                                 float transmission,
                                 float transmission_roughness,
                                 vec4 emission,
+                                float emission_strength,
                                 float alpha,
                                 vec3 N,
                                 vec3 CN,
@@ -436,7 +442,7 @@ void node_bsdf_principled_glass(vec4 base_color,
   result = CLOSURE_DEFAULT;
   result.radiance = render_pass_glossy_mask(refr_color, out_refr * refr_color);
   result.radiance += render_pass_glossy_mask(spec_col, out_spec * spec_col);
-  result.radiance += render_pass_emission_mask(emission.rgb);
+  result.radiance += render_pass_emission_mask(emission.rgb * emission_strength);
   result.radiance *= alpha;
   closure_load_ssr_data(ssr_spec * alpha, roughness, N, viewCameraVec, int(ssr_id), result);
   result.transmittance = vec3(1.

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list