Files
test2/source/blender/gpu/shaders/material/gpu_shader_material_bump.glsl
Weizhen Huang d2db9927ed Fix #86648: reduce ray differentials size for bump mapping
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
2025-02-05 13:39:27 +01:00

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
}