Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-08-08 19:34:25 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-08-08 22:27:26 +0300
commitcac43e1765ab128880bd410d3b8387dc7143f740 (patch)
tree85277c7c6230bda86381266406e46ca85e3a78f0 /source/blender/nodes
parent26d46d00cfa73efe8e434796634dd23e76abbf19 (diff)
Eevee: Use "constant folding" for the principle shader
This is more like a static optimisation when some parameters are set to 1.0 or 0.0. In theses case we use a more optimized version of the node. This also revisit the transmission parameter behaviour to make it closer to cycles.
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c59
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_eevee_specular.c2
2 files changed, 46 insertions, 15 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
index 831ac1c98da..370dcdcc2ea 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
@@ -64,22 +64,12 @@ static void node_shader_init_principled(bNodeTree *UNUSED(ntree), bNode *node)
node->custom2 = SHD_SUBSURFACE_BURLEY;
}
+#define socket_not_zero(sock) (in[sock].link || (clamp_f(in[sock].vec[0], 0.0f, 1.0f) > 1e-5f))
+#define socket_not_one(sock) (in[sock].link || (clamp_f(in[sock].vec[0], 0.0f, 1.0f) < 1.0f - 1e-5f))
+
static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
{
GPUNodeLink *sss_scale;
-#if 0 /* Old 2.7 glsl viewport */
- // normal
- if (!in[17].link)
- in[17].link = GPU_builtin(GPU_VIEW_NORMAL);
- else
- GPU_link(mat, "direction_transform_m4v3", in[17].link, GPU_builtin(GPU_VIEW_MATRIX), &in[17].link);
-
- // clearcoat normal
- if (!in[18].link)
- in[18].link = GPU_builtin(GPU_VIEW_NORMAL);
- else
- GPU_link(mat, "direction_transform_m4v3", in[18].link, GPU_builtin(GPU_VIEW_MATRIX), &in[18].link);
-#endif
/* Normals */
if (!in[17].link) {
@@ -117,9 +107,48 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *node, bNodeE
GPU_link(mat, "set_rgb", GPU_uniform((float *)one), &sss_scale);
}
- GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT);
+ bool use_diffuse = socket_not_one(4) && socket_not_one(15);
+ bool use_subsurf = socket_not_zero(1) && use_diffuse;
+ bool use_refract = socket_not_one(4) && socket_not_zero(15);
+ bool use_clear = socket_not_zero(12);
+
+ /* Due to the manual effort done per config, we only optimize the most common permutations. */
+ char *node_name;
+ uint flag = 0;
+ if (!use_subsurf && use_diffuse && !use_refract && !use_clear) {
+ static char name[] = "node_bsdf_principled_dielectric";
+ node_name = name;
+ flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY;
+ }
+ else if (!use_subsurf && !use_diffuse && !use_refract && !use_clear) {
+ static char name[] = "node_bsdf_principled_metallic";
+ node_name = name;
+ flag = GPU_MATFLAG_GLOSSY;
+ }
+ else if (!use_subsurf && !use_diffuse && !use_refract && use_clear) {
+ static char name[] = "node_bsdf_principled_clearcoat";
+ node_name = name;
+ flag = GPU_MATFLAG_GLOSSY;
+ }
+ else if (use_subsurf && use_diffuse && !use_refract && !use_clear) {
+ static char name[] = "node_bsdf_principled_subsurface";
+ node_name = name;
+ flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_SSS | GPU_MATFLAG_GLOSSY;
+ }
+ else if (!use_subsurf && !use_diffuse && use_refract && !use_clear && !socket_not_zero(4)) {
+ static char name[] = "node_bsdf_principled_glass";
+ node_name = name;
+ flag = GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT;
+ }
+ else {
+ static char name[] = "node_bsdf_principled";
+ node_name = name;
+ flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_SSS | GPU_MATFLAG_REFRACT;
+ }
+
+ GPU_material_flag_set(mat, flag);
- return GPU_stack_link(mat, node, "node_bsdf_principled_clearcoat", in, out, GPU_builtin(GPU_VIEW_POSITION),
+ return GPU_stack_link(mat, node, node_name, in, out, GPU_builtin(GPU_VIEW_POSITION),
GPU_uniform(&node->ssr_id), GPU_uniform(&node->sss_id), sss_scale);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_eevee_specular.c b/source/blender/nodes/shader/nodes/node_shader_eevee_specular.c
index e05b0be1e62..6583dd0cec3 100644
--- a/source/blender/nodes/shader/nodes/node_shader_eevee_specular.c
+++ b/source/blender/nodes/shader/nodes/node_shader_eevee_specular.c
@@ -67,6 +67,8 @@ static int node_shader_gpu_eevee_specular(GPUMaterial *mat, bNode *node, bNodeEx
GPU_link(mat, "set_value", GPU_uniform(&one), &in[9].link);
}
+ GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY);
+
return GPU_stack_link(mat, node, "node_eevee_specular", in, out, GPU_uniform(&node->ssr_id));
}