diff --git a/src/renderers/shaders/ShaderChunk/encodings.glsl b/src/renderers/shaders/ShaderChunk/encodings.glsl index ad24d153486c1bc0b6b9efbcb9a2391a37db2d6c..2533fa7f37a3defd6d74f650750923ef16a271f3 100644 --- a/src/renderers/shaders/ShaderChunk/encodings.glsl +++ b/src/renderers/shaders/ShaderChunk/encodings.glsl @@ -7,7 +7,7 @@ vec4 LinearToLinear( in vec4 value ) { vec4 GammaToLinear( in vec4 value, in float gammaFactor ) { return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w ); } -vec4 LinearTosGamma( in vec4 value, in float gammaFactor ) { +vec4 LinearToGamma( in vec4 value, in float gammaFactor ) { return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w ); } diff --git a/src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl b/src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl index 365c6dd0a2aacd51b874c2177d96f17dcff2f42f..abfeb29f5cc187ef3a179988fce7d4aa441e535f 100644 --- a/src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl +++ b/src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl @@ -1,2 +1,2 @@ - outgoingLight = linearToOutput( outgoingLight ); + outgoingLight = linearToOutputTexel( outgoingLight ); diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index ac8c98d042d9cd20c22ebd133a4e238635863a71..57b9b388ab341cede65b24fd573f12e4212c112c 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,8 +498,9 @@ 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.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 2d4b453f6a9612c186d3bb85f47f1f6d82ccafaa..e1079827d4d09ea1e824c4d60e1447c8505330a7 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -68,7 +68,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) @@ -88,21 +87,13 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { } - var getTextureEncodingFromMap = function( map ) { - if( ! map ) { // no texture - return false; - } + var getTextureEncodingFromMap = function( map, gammaOverrideLinear ) { 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; + if( ! map ) { + encoding = THREE.LinearEncoding; } - 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. + else if( map instanceof THREE.Texture ) { + // add backwards compatibility for WebGLRenderer.gammaInput parameter, should probably be removed at some point. if( encoding === THREE.LinearEncoding && renderer.gammaInput ) { encoding = THREE.GammaEncoding; } @@ -115,16 +106,16 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { precision: precision, supportsVertexTextures: capabilities.vertexTextures, - + outputEncoding: getTextureEncodingFromMap( renderer._currentRenderTarget, 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,