From a763534c7013bf157997873223fb8ca388bb35a2 Mon Sep 17 00:00:00 2001 From: Ben Houston Date: Thu, 25 Feb 2016 16:49:01 -0500 Subject: [PATCH] add support for linearToOutputTexel texture.encoding. --- .../shaders/ShaderChunk/encodings.glsl | 2 +- .../ShaderChunk/linear_to_gamma_fragment.glsl | 2 +- src/renderers/webgl/WebGLProgram.js | 43 ++++++++++--------- src/renderers/webgl/WebGLPrograms.js | 27 ++++-------- 4 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/encodings.glsl b/src/renderers/shaders/ShaderChunk/encodings.glsl index ad24d15348..2533fa7f37 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 365c6dd0a2..abfeb29f5c 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 ac8c98d042..57b9b388ab 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 2d4b453f6a..e1079827d4 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, -- GitLab