Eevee: support the no-op Bump node optimization like in Cycles.

A Bump node without a Height input is meaningless and does nothing.
As such, it is available as an old workaround that allows making Node
Group inputs that default to normal when not connected, by routing
via a no-op Bump node before doing math.

Cycles specifically recognizes this use case and either bypasses
the node, or converts it into a Geometry Normal node, but Eevee
was still evaluating it as usual. That incurred performance cost,
and also normalized the vector unlike Cycles.

This implements the same bypass logic for Eevee. Since I'm not
sure if it's possible to totally remove the node at this stage,
it emits a no-op function call to copy the input vector.

Differential Revision: https://developer.blender.org/D14045
This commit is contained in:
Alexander Gavrilov 2022-02-08 14:12:30 +03:00
parent 3267c91b4d
commit 460d1a4cb3
2 changed files with 16 additions and 0 deletions

View File

@ -109,6 +109,11 @@ void vector_normalize(vec3 normal, out vec3 outnormal)
outnormal = normalize(normal);
}
void vector_copy(vec3 normal, out vec3 outnormal)
{
outnormal = normal;
}
/* Matirx Math */
mat3 euler_to_mat3(vec3 euler)

View File

@ -60,6 +60,17 @@ static int gpu_shader_bump(GPUMaterial *mat,
GPUNodeStack *in,
GPUNodeStack *out)
{
/* If there is no Height input, the node becomes a no-op. */
if (!in[2].link) {
if (!in[5].link) {
return GPU_link(mat, "world_normals_get", &out[0].link);
}
else {
/* Actually running the bump code would normalize, but Cycles handles it as total no-op. */
return GPU_link(mat, "vector_copy", in[5].link, &out[0].link);
}
}
if (!in[5].link) {
GPU_link(mat, "world_normals_get", &in[5].link);
}