2
0
Эх сурвалжийг харах

EXRLoader: fix RGBE data encoding

Guilherme Avila 5 жил өмнө
parent
commit
d4ad0e7ca2

+ 23 - 16
examples/js/loaders/EXRLoader.js

@@ -2151,32 +2151,39 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade
 
 		if ( this.type === THREE.UnsignedByteType ) {
 
-			let v;
+			let v, i, j;
 			const size = byteArray.length;
 			const RGBEArray = new Uint8Array( size );
 
-			for ( let i = 0; i < size; i += 4 ) {
+			for ( let h = 0; h < height; ++ h ) {
 
-				const red = byteArray[ size - ( i + 4 ) ];
-				const green = byteArray[ size - ( i + 3 ) ];
-				const blue = byteArray[ size - ( i + 2 ) ];
+				for ( let w = 0; w < width; ++ w ) {
 
-				v = ( red > green ) ? red : green;
-				v = ( blue > v ) ? blue : v;
+					i = h * width * 4 + w * 4;
+					j = ( height - h ) * width * 4 + w * 4;
 
-				if ( v < 1e-32 ) {
+					const red = byteArray[ j ];
+					const green = byteArray[ j + 1 ];
+					const blue = byteArray[ j + 2 ];
 
-					RGBEArray[ i ] = RGBEArray[ i + 1 ] = RGBEArray[ i + 2 ] = RGBEArray[ i + 3 ] = 0;
+					v = ( red > green ) ? red : green;
+					v = ( blue > v ) ? blue : v;
 
-				} else {
+					if ( v < 1e-32 ) {
+
+						RGBEArray[ i ] = RGBEArray[ i + 1 ] = RGBEArray[ i + 2 ] = RGBEArray[ i + 3 ] = 0;
+
+					} else {
+
+						const res = frexp( v );
+						v = res[ 0 ] * 256 / v;
 
-					const res = frexp( v );
-					v = res[ 0 ] * 256 / v;
+						RGBEArray[ i ] = red * v;
+						RGBEArray[ i + 1 ] = green * v;
+						RGBEArray[ i + 2 ] = blue * v;
+						RGBEArray[ i + 3 ] = res[ 1 ] + 128;
 
-					RGBEArray[ i ] = red * v;
-					RGBEArray[ i + 1 ] = green * v;
-					RGBEArray[ i + 2 ] = blue * v;
-					RGBEArray[ i + 3 ] = res[ 1 ] + 128;
+					}
 
 				}
 

+ 23 - 16
examples/jsm/loaders/EXRLoader.js

@@ -2166,32 +2166,39 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype
 
 		if ( this.type === UnsignedByteType ) {
 
-			let v;
+			let v, i, j;
 			const size = byteArray.length;
 			const RGBEArray = new Uint8Array( size );
 
-			for ( let i = 0; i < size; i += 4 ) {
+			for ( let h = 0; h < height; ++ h ) {
 
-				const red = byteArray[ size - ( i + 4 ) ];
-				const green = byteArray[ size - ( i + 3 ) ];
-				const blue = byteArray[ size - ( i + 2 ) ];
+				for ( let w = 0; w < width; ++ w ) {
 
-				v = ( red > green ) ? red : green;
-				v = ( blue > v ) ? blue : v;
+					i = h * width * 4 + w * 4;
+					j = ( height - h ) * width * 4 + w * 4;
 
-				if ( v < 1e-32 ) {
+					const red = byteArray[ j ];
+					const green = byteArray[ j + 1 ];
+					const blue = byteArray[ j + 2 ];
 
-					RGBEArray[ i ] = RGBEArray[ i + 1 ] = RGBEArray[ i + 2 ] = RGBEArray[ i + 3 ] = 0;
+					v = ( red > green ) ? red : green;
+					v = ( blue > v ) ? blue : v;
 
-				} else {
+					if ( v < 1e-32 ) {
+
+						RGBEArray[ i ] = RGBEArray[ i + 1 ] = RGBEArray[ i + 2 ] = RGBEArray[ i + 3 ] = 0;
+
+					} else {
+
+						const res = frexp( v );
+						v = res[ 0 ] * 256 / v;
 
-					const res = frexp( v );
-					v = res[ 0 ] * 256 / v;
+						RGBEArray[ i ] = red * v;
+						RGBEArray[ i + 1 ] = green * v;
+						RGBEArray[ i + 2 ] = blue * v;
+						RGBEArray[ i + 3 ] = res[ 1 ] + 128;
 
-					RGBEArray[ i ] = red * v;
-					RGBEArray[ i + 1 ] = green * v;
-					RGBEArray[ i + 2 ] = blue * v;
-					RGBEArray[ i + 3 ] = res[ 1 ] + 128;
+					}
 
 				}