From c43a6d4f828e021d0c48220d6ac1d02d992ee20e Mon Sep 17 00:00:00 2001 From: Julien Duroure Date: Sat, 9 Jul 2022 10:03:39 +0200 Subject: glTF exporter: fix division by zero in some specular approximation --- io_scene_gltf2/__init__.py | 2 +- .../imp/gltf2_blender_KHR_materials_specular.py | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py index c3297e1c..5c8872f3 100755 --- a/io_scene_gltf2/__init__.py +++ b/io_scene_gltf2/__init__.py @@ -4,7 +4,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": (3, 3, 14), + "version": (3, 3, 15), 'blender': (3, 3, 0), 'location': 'File > Import-Export', 'description': 'Import-Export as glTF 2.0', diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_KHR_materials_specular.py b/io_scene_gltf2/blender/imp/gltf2_blender_KHR_materials_specular.py index e4a0c52d..3441b5ad 100644 --- a/io_scene_gltf2/blender/imp/gltf2_blender_KHR_materials_specular.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_KHR_materials_specular.py @@ -114,10 +114,13 @@ def specular(mh, location_specular, f0_from_ior = ((ior - 1)/(ior + 1))**2 lum_specular_color = luminance(specular_color_factor) blender_specular = ((lum_specular_color - transmission_factor) / (1 - transmission_factor)) * (1 / 0.08) * f0_from_ior - blender_specular_tint = luminance((normalize(specular_color_factor) - 1) / (normalize(base_color) - 1)) - if blender_specular_tint < 0 or blender_specular_tint > 1: - # TODOExt Warning clamping - blender_specular_tint = np.maximum(np.minimum(blender_specular_tint, 1), 0) + if not all([i == 0 for i in normalize(base_color) - 1]): + blender_specular_tint = luminance((normalize(specular_color_factor) - 1) / (normalize(base_color) - 1)) + if blender_specular_tint < 0 or blender_specular_tint > 1: + # TODOExt Warning clamping + blender_specular_tint = np.maximum(np.minimum(blender_specular_tint, 1), 0) + else: + blender_specular_tint = 1.0 specular_socket.default_value = blender_specular specular_tint_socket.default_value = blender_specular_tint @@ -211,10 +214,13 @@ def specular(mh, location_specular, f0_from_ior = ((ior - 1)/(ior + 1))**2 lum_specular_color = stack3(luminance(buffers['speccolor'])) blender_specular = ((lum_specular_color - buffers['transmission']) / (1 - buffers['transmission'])) * (1 / 0.08) * f0_from_ior - blender_specular_tint = luminance((normalize(buffers['speccolor']) - 1) / (normalize(buffers['basecolor']) - 1)) - np.nan_to_num(blender_specular_tint, copy=False) - blender_specular_tint = np.clip(blender_specular_tint, 0.0, 1.0) - blender_specular_tint = stack3(blender_specular_tint) + if not np.all(normalize(buffers['basecolor']) - 1 == 0.0): + blender_specular_tint = luminance((normalize(buffers['speccolor']) - 1) / (normalize(buffers['basecolor']) - 1)) + np.nan_to_num(blender_specular_tint, copy=False) + blender_specular_tint = np.clip(blender_specular_tint, 0.0, 1.0) + blender_specular_tint = stack3(blender_specular_tint) + else: + blender_specular_tint = stack3(np.ones((width, height))) blender_specular = np.dstack((blender_specular, np.ones((width, height)))) # Set alpha to 1 blender_specular_tint = np.dstack((blender_specular_tint, np.ones((width, height)))) # Set alpha to 1 -- cgit v1.2.3