diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 873b844dd6ff6ac92ab8d4e3739b0a1e5d08685f..24ccb2e03433784185b3b2f502db152317d55d28 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
 bl_info = {
     'name': 'glTF 2.0 format',
     'author': 'Julien Duroure, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin SchmithĂĽsen, Jim Eckerlein, and many external contributors',
-    "version": (1, 4, 27),
+    "version": (1, 4, 28),
     'blender': (2, 90, 0),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
index ca38aa7250fe6c6776c21a1373ac4157872ac6c3..5b9e68f51775ea136bba16e8ca3823eabedf9ed8 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
@@ -348,6 +348,12 @@ def __get_normals(blender_mesh, key_blocks, armature, blender_object, export_set
             ns[:] = __apply_mat_to_all(normal_transform, ns)
             __normalize_vecs(ns)
 
+    for ns in [normals, *morph_normals]:
+        # Replace zero normals with the unit UP vector.
+        # Seems to happen sometimes with degenerate tris?
+        is_zero = ~ns.any(axis=1)
+        ns[is_zero, 2] = 1
+
     # glTF stores deltas in morph targets
     for ns in morph_normals:
         ns -= normals