提交 a763534c 编写于 作者: B Ben Houston

add support for linearToOutputTexel texture.encoding.

上级 4e8c25ac
...@@ -7,7 +7,7 @@ vec4 LinearToLinear( in vec4 value ) { ...@@ -7,7 +7,7 @@ vec4 LinearToLinear( in vec4 value ) {
vec4 GammaToLinear( in vec4 value, in float gammaFactor ) { vec4 GammaToLinear( in vec4 value, in float gammaFactor ) {
return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w ); 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 ); return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );
} }
......
outgoingLight = linearToOutput( outgoingLight ); outgoingLight = linearToOutputTexel( outgoingLight );
...@@ -7,40 +7,42 @@ THREE.WebGLProgram = ( function () { ...@@ -7,40 +7,42 @@ THREE.WebGLProgram = ( function () {
var arrayStructRe = /^([\w\d_]+)\[(\d+)\]\.([\w\d_]+)$/; var arrayStructRe = /^([\w\d_]+)\[(\d+)\]\.([\w\d_]+)$/;
var arrayRe = /^([\w\d_]+)\[0\]$/; var arrayRe = /^([\w\d_]+)\[0\]$/;
function getTexelDecodingFunction( functionName, encoding ) { function getEncodingComponents( encoding ) {
var code = "vec4 " + functionName + "( vec4 value ) { return ";
switch ( encoding ) { switch ( encoding ) {
case THREE.LinearEncoding: case THREE.LinearEncoding:
code += "value"; return ['Linear','( value )'];
break;
case THREE.sRGBEncoding: case THREE.sRGBEncoding:
code += "sRGBToLinear( value )"; return ['sRGB','( value )'];
break;
case THREE.RGBEEncoding: case THREE.RGBEEncoding:
code += "RGBEToLinear( value )"; return ['RGBE','( value )'];
break;
case THREE.RGBM7Encoding: case THREE.RGBM7Encoding:
code += "RGBMToLinear( value, 7.0 )"; return ['RGBM','( value, 7.0 )'];
break;
case THREE.RGBM16Encoding: case THREE.RGBM16Encoding:
code += "RGBMToLinear( value, 16.0 )"; return ['RGBM','( value, 16.0 )'];
break;
case THREE.RGBDEncoding: case THREE.RGBDEncoding:
code += "RGBDToLinear( value, 256.0 )"; return ['RGBD','( value, 256.0 )'];
break;
case THREE.GammaEncoding: case THREE.GammaEncoding:
code += "GammaToLinear( value, float( GAMMA_FACTOR ) )"; return ['Gamma','( value, float( GAMMA_FACTOR ) )'];
break;
default: default:
throw new Error( 'unsupported encoding: ' + encoding ); 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 () { ...@@ -496,8 +498,9 @@ THREE.WebGLProgram = ( function () {
'uniform mat4 viewMatrix;', 'uniform mat4 viewMatrix;',
'uniform vec3 cameraPosition;', '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.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',
......
...@@ -68,7 +68,6 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { ...@@ -68,7 +68,6 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
} }
this.getParameters = function ( material, lights, fog, object ) { this.getParameters = function ( material, lights, fog, object ) {
var shaderID = shaderIDs[ material.type ]; var shaderID = shaderIDs[ material.type ];
// heuristics to create shader parameters according to lights in the scene // heuristics to create shader parameters according to lights in the scene
// (not to blow over maxLights budget) // (not to blow over maxLights budget)
...@@ -88,21 +87,13 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { ...@@ -88,21 +87,13 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
} }
var getTextureEncodingFromMap = function( map ) { var getTextureEncodingFromMap = function( map, gammaOverrideLinear ) {
if( ! map ) { // no texture
return false;
}
var encoding; var encoding;
if( map.encoding !== undefined ) { // standard texture if( ! map ) {
encoding = map.encoding; encoding = THREE.LinearEncoding;
}
else if( map.texture !== undefined ) { // render target pretending to be a texture, get the texture inside it.
encoding = map.texture.encoding;
} }
else { else if( map instanceof THREE.Texture ) {
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.
}
// add backwards compatibility for WebGLRenderer.gammaInput parameter, should probably be removed at some point.
if( encoding === THREE.LinearEncoding && renderer.gammaInput ) { if( encoding === THREE.LinearEncoding && renderer.gammaInput ) {
encoding = THREE.GammaEncoding; encoding = THREE.GammaEncoding;
} }
...@@ -115,16 +106,16 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) { ...@@ -115,16 +106,16 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
precision: precision, precision: precision,
supportsVertexTextures: capabilities.vertexTextures, supportsVertexTextures: capabilities.vertexTextures,
outputEncoding: getTextureEncodingFromMap( renderer._currentRenderTarget, renderer.gammaOutput ),
map: !! material.map, map: !! material.map,
mapEncoding: getTextureEncodingFromMap( material.map ), mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),
envMap: !! material.envMap, envMap: !! material.envMap,
envMapMode: material.envMap && material.envMap.mapping, envMapMode: material.envMap && material.envMap.mapping,
envMapEncoding: getTextureEncodingFromMap( material.envMap ), envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),
lightMap: !! material.lightMap, lightMap: !! material.lightMap,
aoMap: !! material.aoMap, aoMap: !! material.aoMap,
emissiveMap: !! material.emissiveMap, emissiveMap: !! material.emissiveMap,
emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap ), emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),
bumpMap: !! material.bumpMap, bumpMap: !! material.bumpMap,
normalMap: !! material.normalMap, normalMap: !! material.normalMap,
displacementMap: !! material.displacementMap, displacementMap: !! material.displacementMap,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册