blender/intern/cycles/kernel/osl/shaders/node_geometry.osl
Brecht Van Lommel f987ef7b6e Shaders: Add Filter Width input to Bump node
This makes it possible to restore previous Blender 4.3 behavior of bump
mapping, where the large filter width was sometimes (ab)used to get a bevel
like effect on stepwise textures.

For bump from the displacement socket, filter width remains fixed at 0.1.

Ref #133991, #135841

Pull Request: https://projects.blender.org/blender/blender/pulls/136465
2025-03-25 16:29:13 +01:00

63 lines
2.1 KiB
Text

/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#include "stdcycles.h"
shader node_geometry(string bump_offset = "center",
float bump_filter_width = BUMP_FILTER_WIDTH,
output point Position = point(0.0, 0.0, 0.0),
output normal Normal = normal(0.0, 0.0, 0.0),
output normal Tangent = normal(0.0, 0.0, 0.0),
output normal TrueNormal = normal(0.0, 0.0, 0.0),
output vector Incoming = vector(0.0, 0.0, 0.0),
output point Parametric = point(0.0, 0.0, 0.0),
output float Backfacing = 0.0,
output float Pointiness = 0.0,
output float RandomPerIsland = 0.0)
{
Position = P;
Normal = N;
TrueNormal = Ng;
Incoming = I;
Parametric = point(1.0 - u - v, u, 0.0);
Backfacing = backfacing();
if (bump_offset == "dx") {
Position += Dx(Position) * bump_filter_width;
Parametric += Dx(Parametric) * bump_filter_width;
}
else if (bump_offset == "dy") {
Position += Dy(Position) * bump_filter_width;
Parametric += Dy(Parametric) * bump_filter_width;
}
point generated;
float IsCurve = 0;
float IsPoint = 0;
getattribute("geom:is_curve", IsCurve);
getattribute("geom:is_point", IsPoint);
/* create spherical tangent from generated coordinates if they're available,
* unless we're on a curve or point. */
if (!(IsCurve || IsPoint) && getattribute("geom:generated", generated)) {
normal data = normal(-(generated[1] - 0.5), (generated[0] - 0.5), 0.0);
vector T = transform("object", "world", data);
Tangent = cross(Normal, normalize(cross(T, Normal)));
}
else {
/* otherwise use surface derivatives */
Tangent = normalize(dPdu);
}
getattribute("geom:pointiness", Pointiness);
if (bump_offset == "dx") {
Pointiness += Dx(Pointiness) * bump_filter_width;
}
else if (bump_offset == "dy") {
Pointiness += Dy(Pointiness) * bump_filter_width;
}
getattribute("geom:random_per_island", RandomPerIsland);
}