Browse Source

add support for Texture.encoding to Material.map

Ben Houston 9 years ago
parent
commit
15e08c1327

+ 1 - 0
src/Three.js

@@ -315,3 +315,4 @@ THREE.RGBEEncoding = 3002; // AKA Radiance
 THREE.RGBM7Encoding = 3004;
 THREE.RGBM7Encoding = 3004;
 THREE.RGBM16Encoding = 3005;
 THREE.RGBM16Encoding = 3005;
 //THREE.RGBDEncoding = 3006; TODO
 //THREE.RGBDEncoding = 3006; TODO
+THREE.DefaultEncoding = 3007; // Use sRGB or Linear as appropriate.

+ 5 - 4
src/renderers/WebGLRenderer.js

@@ -1888,6 +1888,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		}
 		}
 
 
 		uniforms.map.value = material.map;
 		uniforms.map.value = material.map;
+		uniforms.mapEncoding.value = (( material.map && material.map.encoding !== THREE.DefaultEncoding ) ? material.map.encoding : THREE.sRGBEncoding );
 		uniforms.specularMap.value = material.specularMap;
 		uniforms.specularMap.value = material.specularMap;
 		uniforms.alphaMap.value = material.alphaMap;
 		uniforms.alphaMap.value = material.alphaMap;
 
 
@@ -1962,7 +1963,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		}
 		}
 
 
 		uniforms.envMap.value = material.envMap;
 		uniforms.envMap.value = material.envMap;
-		uniforms.envMapEncoding.value = ( material.envMap ? material.envMap.encoding : THREE.LinearEncoding );
+		uniforms.envMapEncoding.value = (( material.envMap  && material.envMap.encoding !== THREE.DefaultEncoding )? material.envMap.encoding : THREE.LinearEncoding );
 		uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : - 1;
 		uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : - 1;
 
 
 		uniforms.reflectivity.value = material.reflectivity;
 		uniforms.reflectivity.value = material.reflectivity;
@@ -2034,7 +2035,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		if ( material.emissiveMap ) {
 		if ( material.emissiveMap ) {
 
 
 			uniforms.emissiveMap.value = material.emissiveMap;
 			uniforms.emissiveMap.value = material.emissiveMap;
-			uniforms.emissiveMapEncoding.value = material.emissiveMap.encoding;
+			uniforms.emissiveMapEncoding.value = ( material.emissiveMap.encoding !== THREE.DefaultEncoding ) ? material.emissiveMap.encoding : THREE.LinearEncoding;
 
 
 		}
 		}
 
 
@@ -2055,7 +2056,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		if ( material.emissiveMap ) {
 		if ( material.emissiveMap ) {
 
 
 			uniforms.emissiveMap.value = material.emissiveMap;
 			uniforms.emissiveMap.value = material.emissiveMap;
-			uniforms.emissiveMapEncoding.value = material.emissiveMap.encoding;
+			uniforms.emissiveMapEncoding.value = ( material.emissiveMap.encoding !== THREE.DefaultEncoding ) ? material.emissiveMap.encoding : THREE.LinearEncoding;
 
 
 		}
 		}
 
 
@@ -2110,7 +2111,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		if ( material.emissiveMap ) {
 		if ( material.emissiveMap ) {
 
 
 			uniforms.emissiveMap.value = material.emissiveMap;
 			uniforms.emissiveMap.value = material.emissiveMap;
-			uniforms.emissiveMapEncoding.value = material.emissiveMap.encoding;
+			uniforms.emissiveMapEncoding.value = ( material.emissiveMap.encoding !== THREE.DefaultEncoding ) ? material.emissiveMap.encoding : THREE.LinearEncoding;
 
 
 		}
 		}
 
 

+ 2 - 2
src/renderers/shaders/ShaderChunk/encodings.glsl

@@ -18,7 +18,7 @@ vec4 texelDecode( in vec4 encodedTexel, in int encoding ) {
   }
   }
 
 
   if( encoding == ENCODING_sRGB ) {
   if( encoding == ENCODING_sRGB ) {
-    return vec4( pow( encodedTexel.xyz, vec3( GAMMA_FACTOR ) ), encodedTexel.w );
+    return vec4( pow( encodedTexel.xyz, vec3( float( GAMMA_FACTOR ) ) ), encodedTexel.w );
   }
   }
 
 
   if( encoding == ENCODING_RGBE ) {
   if( encoding == ENCODING_RGBE ) {
@@ -56,7 +56,7 @@ vec4 texelEncode( in vec4 linearRgba, in int encoding )
   }
   }
 
 
   if( encoding == ENCODING_sRGB ) {
   if( encoding == ENCODING_sRGB ) {
-    return vec4( pow( linearRgba.xyz, vec3( 1.0 / GAMMA_FACTOR ) ), linearRgba.w );
+    return vec4( pow( linearRgba.xyz, vec3( 1.0 / float( GAMMA_FACTOR ) ) ), linearRgba.w );
   }
   }
 
 
   if( encoding == ENCODING_RGBE ) {
   if( encoding == ENCODING_RGBE ) {

+ 1 - 2
src/renderers/shaders/ShaderChunk/map_fragment.glsl

@@ -2,8 +2,7 @@
 
 
 	vec4 texelColor = texture2D( map, vUv );
 	vec4 texelColor = texture2D( map, vUv );
 
 
-	texelColor.xyz = inputToLinear( texelColor.xyz );
-
+	texelColor = texelDecode( texelColor, mapEncoding );
 	diffuseColor *= texelColor;
 	diffuseColor *= texelColor;
 
 
 #endif
 #endif

+ 2 - 1
src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl

@@ -1,5 +1,6 @@
 #ifdef USE_MAP
 #ifdef USE_MAP
 
 
 	uniform sampler2D map;
 	uniform sampler2D map;
+	uniform int mapEncoding;
 
 
-#endif
+#endif

+ 1 - 0
src/renderers/shaders/UniformsLib.js

@@ -10,6 +10,7 @@ THREE.UniformsLib = {
 		"opacity": { type: "f", value: 1.0 },
 		"opacity": { type: "f", value: 1.0 },
 
 
 		"map": { type: "t", value: null },
 		"map": { type: "t", value: null },
+		"mapEncoding" : { type: "i", value: THREE.sRGBEncoding },
 		"offsetRepeat": { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
 		"offsetRepeat": { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
 
 
 		"specularMap": { type: "t", value: null },
 		"specularMap": { type: "t", value: null },

+ 1 - 1
src/textures/Texture.js

@@ -36,7 +36,7 @@ THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, f
 	this.premultiplyAlpha = false;
 	this.premultiplyAlpha = false;
 	this.flipY = true;
 	this.flipY = true;
 	this.unpackAlignment = 4;	// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
 	this.unpackAlignment = 4;	// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
-	this.encoding = THREE.LinearEncoding;	// Values !== THREE.LinearEncoding only supported on envMap and emissiveMap (as these maps regularly have unbounded intensity values, i.e. via an *.hdr or *.exr image.)
+	this.encoding = THREE.DefaultEncoding;	// Values !== THREE.LinearEncoding only supported on map, envMap and emissiveMap (as these maps regularly have unbounded intensity values, i.e. via an *.hdr or *.exr image.)
 
 
 	this.version = 0;
 	this.version = 0;
 	this.onUpdate = null;
 	this.onUpdate = null;