Browse Source

Clamp prior to converting to half float (#22451)

WestLangley 3 years ago
parent
commit
a430cd96e5
1 changed files with 4 additions and 3 deletions
  1. 4 3
      examples/jsm/loaders/RGBELoader.js

+ 4 - 3
examples/jsm/loaders/RGBELoader.js

@@ -354,9 +354,10 @@ class RGBELoader extends DataTextureLoader {
 			const e = sourceArray[ sourceOffset + 3 ];
 			const scale = Math.pow( 2.0, e - 128.0 ) / 255.0;
 
-			destArray[ destOffset + 0 ] = DataUtils.toHalfFloat( sourceArray[ sourceOffset + 0 ] * scale );
-			destArray[ destOffset + 1 ] = DataUtils.toHalfFloat( sourceArray[ sourceOffset + 1 ] * scale );
-			destArray[ destOffset + 2 ] = DataUtils.toHalfFloat( sourceArray[ sourceOffset + 2 ] * scale );
+			// clamping to 65504, the maximum representable value in float16
+			destArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );
+			destArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );
+			destArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );
 
 		};