From ef494b279448a9b1ca7ad384a3ae0e53fb11de5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 13 Oct 2023 18:00:46 +0200 Subject: [PATCH] Fix EEVEE-Next: Broken Barycentric on Metal --- .../engines/eevee_next/shaders/eevee_surf_lib.glsl | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl index 11de6e09ddb..ef831a91a6e 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl @@ -12,6 +12,16 @@ #if defined(USE_BARYCENTRICS) && defined(GPU_FRAGMENT_SHADER) && defined(MAT_GEOM_MESH) vec3 barycentric_distances_get() { +# if defined(GPU_METAL) + /* Calculate Barycentric distances from available parameters in Metal. */ + float wp_delta = length(dfdx(interp.P)) + length(dfdy(interp.P)); + float bc_delta = length(dfdx(gpu_BaryCoord)) + length(dfdy(gpu_BaryCoord)); + float rate_of_change = wp_delta / bc_delta; + vec3 dists; + dists.x = rate_of_change * (1.0 - gpu_BaryCoord.x); + dists.y = rate_of_change * (1.0 - gpu_BaryCoord.y); + dists.z = rate_of_change * (1.0 - gpu_BaryCoord.z); +# elif /* NOTE: No need to undo perspective divide since it has not been applied. */ vec3 pos0 = (ProjectionMatrixInverse * gpu_position_at_vertex(0)).xyz; vec3 pos1 = (ProjectionMatrixInverse * gpu_position_at_vertex(1)).xyz; @@ -29,7 +39,8 @@ vec3 barycentric_distances_get() dists.y = sqrt(dot(edge10, edge10) - d * d); d = dot(d10, edge21); dists.z = sqrt(dot(edge21, edge21) - d * d); - return dists.xyz; +# endif + return dists; } #endif