diff --git a/src/mol-gl/shader/marching-cubes/isosurface.frag b/src/mol-gl/shader/marching-cubes/isosurface.frag
index 36bd6d1be219b336b92db00fe27de5a4336d80b8..1aa1116c291072f9dd3350ac7dba90c409ddc75b 100644
--- a/src/mol-gl/shader/marching-cubes/isosurface.frag
+++ b/src/mol-gl/shader/marching-cubes/isosurface.frag
@@ -188,16 +188,21 @@ void main(void) {
 
     // normals from gradients
     vec3 n0 = -normalize(vec3(
-        v0 - voxel((b0 + c1) / uGridDim).a,
-        v0 - voxel((b0 + c3) / uGridDim).a,
-        v0 - voxel((b0 + c4) / uGridDim).a
+        voxel((b0 - c1) / uGridDim).a - voxel((b0 + c1) / uGridDim).a,
+        voxel((b0 - c3) / uGridDim).a - voxel((b0 + c3) / uGridDim).a,
+        voxel((b0 - c4) / uGridDim).a - voxel((b0 + c4) / uGridDim).a
     ));
     vec3 n1 = -normalize(vec3(
-        v1 - voxel((b1 + c1) / uGridDim).a,
-        v1 - voxel((b1 + c3) / uGridDim).a,
-        v1 - voxel((b1 + c4) / uGridDim).a
+        voxel((b1 - c1) / uGridDim).a - voxel((b1 + c1) / uGridDim).a,
+        voxel((b1 - c3) / uGridDim).a - voxel((b1 + c3) / uGridDim).a,
+        voxel((b1 - c4) / uGridDim).a - voxel((b1 + c4) / uGridDim).a
     ));
-    gl_FragData[1].xyz = -normalize((v0 * n0 + v1 * n1) / max(v0 + v1, EPS));
+    gl_FragData[1].xyz = -vec3(
+        n0.x + t * (n0.x - n1.x),
+        n0.y + t * (n0.y - n1.y),
+        n0.z + t * (n0.z - n1.z)
+    );
+    
     mat3 normalMatrix = transpose(inverse(mat3(uGridTransform)));
     gl_FragData[1].xyz = normalMatrix * gl_FragData[1].xyz;
 }
\ No newline at end of file