diff --git a/build/three.js b/build/three.js index 2ad063ef0e4a16..70bf6f7add10c5 100644 --- a/build/three.js +++ b/build/three.js @@ -29464,38 +29464,6 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { } - function getTextureEncodingFromMap( map ) { - - if ( ! map ) return false; - - var encoding; - - if ( map instanceof THREE.Texture ) { - - encoding = map.encoding; - - } else if ( map instanceof THREE.WebGLRenderTarget ) { - - encoding = map.texture.encoding; - - } else { - - throw new Error( "can not determine texture encoding from map: " + map ); - - } - - // add backwards compatibility for WebGLRenderer.gammaInput parameter, should probably be removed at some point. - - if ( encoding === THREE.LinearEncoding && renderer.gammaInput ) { - - encoding = THREE.GammaEncoding; - - } - - return encoding; - - } - this.getParameters = function ( material, lights, fog, object ) { var shaderID = shaderIDs[ material.type ]; @@ -29517,6 +29485,27 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { } + var getTextureEncodingFromMap = function( map ) { + if( ! map ) { // no texture + return false; + } + var encoding; + if( map.encoding !== undefined ) { // standard texture + encoding = map.encoding; + } + else if( map.texture !== undefined ) { // render target pretending to be a texture, get the texture inside it. + encoding = map.texture.encoding; + } + else { + throw new Error( "can not determine texture encoding from map: " + map ); + } + // add backwards compatibility for WebGLRenderer.gammaInput parameter, should probably be removed at some point. + if( encoding === THREE.LinearEncoding && renderer.gammaInput ) { + encoding = THREE.GammaEncoding; + } + return encoding; + } + var parameters = { shaderID: shaderID, diff --git a/build/three.min.js b/build/three.min.js index ab4fd24df5ab4f..39ea0fefa2255a 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -489,7 +489,7 @@ THREE.Mesh=function(a,b){THREE.Object3D.call(this);this.type="Mesh";this.geometr THREE.Mesh.prototype.updateMorphTargets=function(){if(void 0!==this.geometry.morphTargets&&0b.far?null:{distance:c,point:x.clone(), -object:a}}function c(c,d,e,f,l,p,n,t){g.fromArray(f,3*p);h.fromArray(f,3*n);k.fromArray(f,3*t);if(c=b(c,d,e,g,h,k,u))l&&(m.fromArray(l,2*p),q.fromArray(l,2*n),r.fromArray(l,2*t),c.uv=a(u,g,h,k,m,q,r)),c.face=new THREE.Face3(p,n,t,THREE.Triangle.normal(g,h,k)),c.faceIndex=p;return c}var d=new THREE.Matrix4,e=new THREE.Ray,f=new THREE.Sphere,g=new THREE.Vector3,h=new THREE.Vector3,k=new THREE.Vector3,l=new THREE.Vector3,n=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector2,q=new THREE.Vector2, +object:a}}function c(c,d,e,f,l,n,p,t){g.fromArray(f,3*n);h.fromArray(f,3*p);k.fromArray(f,3*t);if(c=b(c,d,e,g,h,k,u))l&&(m.fromArray(l,2*n),q.fromArray(l,2*p),r.fromArray(l,2*t),c.uv=a(u,g,h,k,m,q,r)),c.face=new THREE.Face3(n,p,t,THREE.Triangle.normal(g,h,k)),c.faceIndex=n;return c}var d=new THREE.Matrix4,e=new THREE.Ray,f=new THREE.Sphere,g=new THREE.Vector3,h=new THREE.Vector3,k=new THREE.Vector3,l=new THREE.Vector3,n=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector2,q=new THREE.Vector2, r=new THREE.Vector2,t=new THREE.Vector3,u=new THREE.Vector3,x=new THREE.Vector3;return function(t,x){var w=this.geometry,D=this.material,A=this.matrixWorld;if(void 0!==D&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(A),!1!==t.ray.intersectsSphere(f)&&(d.getInverse(A),e.copy(t.ray).applyMatrix4(d),null===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var y,B;if(w instanceof THREE.BufferGeometry){var G,E,D=w.index,A=w.attributes,w=A.position.array; void 0!==A.uv&&(y=A.uv.array);if(null!==D)for(var A=D.array,z=0,K=A.length;z=da.maxTextures&&console.warn("WebGLRenderer: trying to use "+ +(f.opacity.value=c.opacity);v(e.uniformsList)}s.uniformMatrix4fv(n.modelViewMatrix,!1,d.modelViewMatrix.elements);n.normalMatrix&&s.uniformMatrix3fv(n.normalMatrix,!1,d.normalMatrix.elements);void 0!==n.modelMatrix&&s.uniformMatrix4fv(n.modelMatrix,!1,d.matrixWorld.elements);if(!0===e.hasDynamicUniforms){e=e.uniformsList;c=[];p=0;for(b=e.length;p=da.maxTextures&&console.warn("WebGLRenderer: trying to use "+ a+" texture units while this GPU supports only "+da.maxTextures);ta+=1;return a}function v(a){for(var b,c,d=0,e=a.length;db||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElement("canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function D(a){return THREE.Math.isPowerOfTwo(a.width)&& THREE.Math.isPowerOfTwo(a.height)}function A(a,b){var c=T.get(a);if(6===a.image.length)if(0h;h++)g[h]=!Y.autoScaleCubemaps|| -d||e?e?a.image[h].image:a.image[h]:w(a.image[h],da.maxCubemapSize);var k=D(g[0]),l=z(a.format),m=z(a.type);C(s.TEXTURE_CUBE_MAP,a,k);for(h=0;6>h;h++)if(d)for(var q,n=g[h].mipmaps,p=0,r=n.length;ph;h++)if(d)for(var n,p=g[h].mipmaps,q=0,r=p.length;q + gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) ); - gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + #include } diff --git a/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl b/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl index 432fc4aa5eb3a4..08cf1d3965ba81 100644 --- a/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl @@ -41,9 +41,9 @@ void main() { vec3 outgoingLight = reflectedLight.indirectDiffuse; #include - #include - #include - gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) ); + + #include } diff --git a/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl b/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl index afb30116205f86..648b42aa39ebd9 100644 --- a/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl @@ -68,9 +68,9 @@ void main() { vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveLight; #include - #include - #include - gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) ); + + #include } diff --git a/src/renderers/shaders/ShaderLib/meshphong_frag.glsl b/src/renderers/shaders/ShaderLib/meshphong_frag.glsl index 87d22e4356a55d..f9f91e83aef99a 100644 --- a/src/renderers/shaders/ShaderLib/meshphong_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshphong_frag.glsl @@ -52,10 +52,9 @@ void main() { vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight; #include - #include - #include + gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) ); - gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + #include } diff --git a/src/renderers/shaders/ShaderLib/meshstandard_frag.glsl b/src/renderers/shaders/ShaderLib/meshstandard_frag.glsl index f9d9e7fd3e5192..4c13ebfc731821 100644 --- a/src/renderers/shaders/ShaderLib/meshstandard_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshstandard_frag.glsl @@ -64,10 +64,8 @@ void main() { vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight; - #include + gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) ); #include - gl_FragColor = vec4( outgoingLight, diffuseColor.a ); - } diff --git a/src/renderers/shaders/ShaderLib/points_frag.glsl b/src/renderers/shaders/ShaderLib/points_frag.glsl index f4accc1fe90da5..2dbdcadb0060d2 100644 --- a/src/renderers/shaders/ShaderLib/points_frag.glsl +++ b/src/renderers/shaders/ShaderLib/points_frag.glsl @@ -20,8 +20,8 @@ void main() { outgoingLight = diffuseColor.rgb; - #include + gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) ); - gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + #include } diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index ac8c98d042d9cd..330501249b9e78 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -7,40 +7,42 @@ THREE.WebGLProgram = ( function () { var arrayStructRe = /^([\w\d_]+)\[(\d+)\]\.([\w\d_]+)$/; var arrayRe = /^([\w\d_]+)\[0\]$/; - function getTexelDecodingFunction( functionName, encoding ) { - - var code = "vec4 " + functionName + "( vec4 value ) { return "; + function getEncodingComponents( encoding ) { switch ( encoding ) { case THREE.LinearEncoding: - code += "value"; - break; + return ['Linear','( value )']; case THREE.sRGBEncoding: - code += "sRGBToLinear( value )"; - break; + return ['sRGB','( value )']; case THREE.RGBEEncoding: - code += "RGBEToLinear( value )"; - break; + return ['RGBE','( value )']; case THREE.RGBM7Encoding: - code += "RGBMToLinear( value, 7.0 )"; - break; + return ['RGBM','( value, 7.0 )']; case THREE.RGBM16Encoding: - code += "RGBMToLinear( value, 16.0 )"; - break; + return ['RGBM','( value, 16.0 )']; case THREE.RGBDEncoding: - code += "RGBDToLinear( value, 256.0 )"; - break; + return ['RGBD','( value, 256.0 )']; case THREE.GammaEncoding: - code += "GammaToLinear( value, float( GAMMA_FACTOR ) )"; - break; + return ['Gamma','( value, float( GAMMA_FACTOR ) )']; default: throw new Error( 'unsupported encoding: ' + encoding ); } - code += "; }"; - return code; + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[0] + "ToLinear" + components[1] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[0] + components[1] + "; }"; } @@ -496,11 +498,12 @@ THREE.WebGLProgram = ( function () { 'uniform mat4 viewMatrix;', 'uniform vec3 cameraPosition;', - ( parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? THREE.ShaderChunk[ 'encodings' ] : '', + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? THREE.ShaderChunk[ 'encodings' ] : '', parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', '\n' diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index c0c55dd25fb467..9eff101a1427c6 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -67,29 +67,28 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { } - function getTextureEncodingFromMap( map ) { - - if ( ! map ) return false; + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { var encoding; - if ( map instanceof THREE.Texture ) { + if( ! map ) { - encoding = map.encoding; + encoding = THREE.LinearEncoding; - } else if ( map instanceof THREE.WebGLRenderTarget ) { + } + else if( map instanceof THREE.Texture ) { - encoding = map.texture.encoding; + encoding = map.encoding; - } else { + } + else if( map instanceof THREE.WebGLRenderTarget ) { - throw new Error( "can not determine texture encoding from map: " + map ); + encoding = map.texture.encoding; } - // add backwards compatibility for WebGLRenderer.gammaInput parameter, should probably be removed at some point. - - if ( encoding === THREE.LinearEncoding && renderer.gammaInput ) { + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if( encoding === THREE.LinearEncoding && gammaOverrideLinear ) { encoding = THREE.GammaEncoding; @@ -100,7 +99,6 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { } this.getParameters = function ( material, lights, fog, object ) { - var shaderID = shaderIDs[ material.type ]; // heuristics to create shader parameters according to lights in the scene // (not to blow over maxLights budget) @@ -119,23 +117,22 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { } } - var parameters = { shaderID: shaderID, precision: precision, supportsVertexTextures: capabilities.vertexTextures, - + outputEncoding: getTextureEncodingFromMap( renderer.getCurrentRenderTarget(), renderer.gammaOutput ), map: !! material.map, - mapEncoding: getTextureEncodingFromMap( material.map ), + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), envMap: !! material.envMap, envMapMode: material.envMap && material.envMap.mapping, - envMapEncoding: getTextureEncodingFromMap( material.envMap ), + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), lightMap: !! material.lightMap, aoMap: !! material.aoMap, emissiveMap: !! material.emissiveMap, - emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap ), + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), bumpMap: !! material.bumpMap, normalMap: !! material.normalMap, displacementMap: !! material.displacementMap, diff --git a/utils/build/includes/common.json b/utils/build/includes/common.json index 6f75beb7603c0b..db065a79cc67c9 100644 --- a/utils/build/includes/common.json +++ b/utils/build/includes/common.json @@ -155,7 +155,6 @@ "src/renderers/shaders/ShaderChunk/lights_standard_fragment.glsl", "src/renderers/shaders/ShaderChunk/lights_standard_pars_fragment.glsl", "src/renderers/shaders/ShaderChunk/lights_template.glsl", - "src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl", "src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl", "src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl", "src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl",