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
53 lines
1.2 KiB
GLSL
53 lines
1.2 KiB
GLSL
/* SPDX-FileCopyrightText: 2019-2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
void differentiate_texco(vec3 v, out vec3 df)
|
|
{
|
|
/* Implementation defined. */
|
|
df = v + dF_impl(v);
|
|
}
|
|
|
|
/* Overload for UVs which are loaded as generic attributes. */
|
|
void differentiate_texco(vec4 v, out vec3 df)
|
|
{
|
|
/* Implementation defined. */
|
|
df = v.xyz + dF_impl(v.xyz);
|
|
}
|
|
|
|
void node_bump(float strength,
|
|
float dist,
|
|
float height,
|
|
vec3 N,
|
|
vec2 height_xy,
|
|
float invert,
|
|
out vec3 result)
|
|
{
|
|
N = normalize(N);
|
|
dist *= FrontFacing ? invert : -invert;
|
|
|
|
#ifdef GPU_FRAGMENT_SHADER
|
|
vec3 dPdx = dFdx(g_data.P);
|
|
vec3 dPdy = dFdy(g_data.P);
|
|
|
|
/* Get surface tangents from normal. */
|
|
vec3 Rx = cross(dPdy, N);
|
|
vec3 Ry = cross(N, dPdx);
|
|
|
|
/* Compute surface gradient and determinant. */
|
|
float det = dot(dPdx, Rx);
|
|
|
|
vec2 dHd = height_xy - vec2(height);
|
|
vec3 surfgrad = dHd.x * Rx + dHd.y * Ry;
|
|
|
|
strength = max(strength, 0.0);
|
|
|
|
/* NOTE: keep the same as defined `BUMP_DX`. */
|
|
const float bump_dx = 0.1;
|
|
result = normalize(bump_dx * abs(det) * N - dist * sign(det) * surfgrad);
|
|
result = normalize(mix(N, result, strength));
|
|
#else
|
|
result = N;
|
|
#endif
|
|
}
|