diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2022-12-06 10:56:58 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2022-12-06 10:56:58 +0100 |
commit | e19ead8e37b8b7c69c5a2b89cc603588f146c34a (patch) | |
tree | fcafab281b60832b9b9895a2ac1b48311fb3dbd0 /scene/resources | |
parent | 6fd516212424a3a5305f4f002d8a099f454d2854 (diff) | |
parent | d926be72ed38f5b639f3f186175b3b2c978fb202 (diff) |
Merge pull request #50294 from Calinou/distance-fade-use-circular-fade
Use circular fade instead of linear fade for distance fade
Diffstat (limited to 'scene/resources')
-rw-r--r-- | scene/resources/material.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index e457b2d377..a16d2c2072 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -1252,15 +1252,16 @@ void BaseMaterial3D::_update_shader() { } if (distance_fade != DISTANCE_FADE_DISABLED) { + // Use the slightly more expensive circular fade (distance to the object) instead of linear + // (Z distance), so that the fade is always the same regardless of the camera angle. if ((distance_fade == DISTANCE_FADE_OBJECT_DITHER || distance_fade == DISTANCE_FADE_PIXEL_DITHER)) { if (!RenderingServer::get_singleton()->is_low_end()) { code += " {\n"; if (distance_fade == DISTANCE_FADE_OBJECT_DITHER) { - code += " float fade_distance = abs((VIEW_MATRIX * MODEL_MATRIX[3]).z);\n"; - + code += " float fade_distance = length((VIEW_MATRIX * MODEL_MATRIX[3]));\n"; } else { - code += " float fade_distance = -VERTEX.z;\n"; + code += " float fade_distance = length(VERTEX);\n"; } // Use interleaved gradient noise, which is fast but still looks good. code += " const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f);"; @@ -1274,7 +1275,7 @@ void BaseMaterial3D::_update_shader() { } } else { - code += " ALPHA*=clamp(smoothstep(distance_fade_min,distance_fade_max,-VERTEX.z),0.0,1.0);\n"; + code += " ALPHA *= clamp(smoothstep(distance_fade_min, distance_fade_max, length(VERTEX)), 0.0, 1.0);\n"; } } |