Use sub-pixel differentials for bump mapping helps with reducing artifacts when objects are moving or when textures have high frequency details. Currently we scale it by 0.1 because it seems to work good in practice, we can adjust the value in the future if it turns out to be impractical. Ref: #122892 Pull Request: https://projects.blender.org/blender/blender/pulls/133991
63 lines
2.0 KiB
Plaintext
63 lines
2.0 KiB
Plaintext
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#include "stdcycles.h"
|
|
|
|
shader node_geometry(string bump_offset = "center",
|
|
|
|
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_DX;
|
|
Parametric += Dx(Parametric) * BUMP_DX;
|
|
}
|
|
else if (bump_offset == "dy") {
|
|
Position += Dy(Position) * BUMP_DY;
|
|
Parametric += Dy(Parametric) * BUMP_DY;
|
|
}
|
|
|
|
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_DX;
|
|
}
|
|
else if (bump_offset == "dy") {
|
|
Pointiness += Dy(Pointiness) * BUMP_DY;
|
|
}
|
|
|
|
getattribute("geom:random_per_island", RandomPerIsland);
|
|
}
|