diff --git a/examples/jsm/loaders/ColladaLoader.js b/examples/jsm/loaders/ColladaLoader.js index 0f50e0ab2193d3..96648d1f667ecb 100644 --- a/examples/jsm/loaders/ColladaLoader.js +++ b/examples/jsm/loaders/ColladaLoader.js @@ -36,7 +36,8 @@ import { TextureLoader, Vector2, Vector3, - VectorKeyframeTrack + VectorKeyframeTrack, + sRGBEncoding } from 'three'; import { TGALoader } from '../loaders/TGALoader.js'; @@ -1579,7 +1580,7 @@ class ColladaLoader extends Loader { material.name = data.name || ''; - function getTexture( textureObject ) { + function getTexture( textureObject, encoding = null ) { const sampler = effect.profile.samplers[ textureObject.id ]; let image = null; @@ -1627,6 +1628,12 @@ class ColladaLoader extends Loader { } + if ( encoding !== null ) { + + texture.encoding = encoding; + + } + return texture; } else { @@ -1657,7 +1664,7 @@ class ColladaLoader extends Loader { case 'diffuse': if ( parameter.color ) material.color.fromArray( parameter.color ); - if ( parameter.texture ) material.map = getTexture( parameter.texture ); + if ( parameter.texture ) material.map = getTexture( parameter.texture, sRGBEncoding ); break; case 'specular': if ( parameter.color && material.specular ) material.specular.fromArray( parameter.color ); @@ -1667,20 +1674,24 @@ class ColladaLoader extends Loader { if ( parameter.texture ) material.normalMap = getTexture( parameter.texture ); break; case 'ambient': - if ( parameter.texture ) material.lightMap = getTexture( parameter.texture ); + if ( parameter.texture ) material.lightMap = getTexture( parameter.texture, sRGBEncoding ); break; case 'shininess': if ( parameter.float && material.shininess ) material.shininess = parameter.float; break; case 'emission': if ( parameter.color && material.emissive ) material.emissive.fromArray( parameter.color ); - if ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture ); + if ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture, sRGBEncoding ); break; } } + material.color.convertSRGBToLinear(); + if ( material.specular ) material.specular.convertSRGBToLinear(); + if ( material.emissive ) material.emissive.convertSRGBToLinear(); + // let transparent = parameters[ 'transparent' ]; @@ -2015,7 +2026,7 @@ class ColladaLoader extends Loader { case 'color': const array = parseFloats( child.textContent ); - data.color = new Color().fromArray( array ); + data.color = new Color().fromArray( array ).convertSRGBToLinear(); break; case 'falloff_angle': @@ -2481,7 +2492,7 @@ class ColladaLoader extends Loader { break; case 'COLOR': - buildGeometryData( primitive, sources[ input.id ], input.offset, color.array ); + buildGeometryData( primitive, sources[ input.id ], input.offset, color.array, true ); color.stride = sources[ input.id ].stride; break; @@ -2520,7 +2531,7 @@ class ColladaLoader extends Loader { } - function buildGeometryData( primitive, source, offset, array ) { + function buildGeometryData( primitive, source, offset, array, isColor = false ) { const indices = primitive.p; const stride = primitive.stride; @@ -2537,6 +2548,22 @@ class ColladaLoader extends Loader { } + if ( isColor ) { + + // convert the vertex colors from srgb to linear if present + const startIndex = array.length - sourceStride - 1; + tempColor.setRGB( + array[ startIndex + 0 ], + array[ startIndex + 1 ], + array[ startIndex + 2 ] + ).convertSRGBToLinear(); + + array[ startIndex + 0 ] = tempColor.r; + array[ startIndex + 1 ] = tempColor.g; + array[ startIndex + 2 ] = tempColor.b; + + } + } const sourceArray = source.array; @@ -3981,6 +4008,7 @@ class ColladaLoader extends Loader { // + const tempColor = new Color(); const animations = []; let kinematics = {}; let count = 0; diff --git a/examples/screenshots/webgl_loader_collada_kinematics.jpg b/examples/screenshots/webgl_loader_collada_kinematics.jpg index 59dcd2509a861d..7b532dd778cd61 100644 Binary files a/examples/screenshots/webgl_loader_collada_kinematics.jpg and b/examples/screenshots/webgl_loader_collada_kinematics.jpg differ diff --git a/examples/screenshots/webgl_loader_collada_skinning.jpg b/examples/screenshots/webgl_loader_collada_skinning.jpg index e089e9b4f145a2..9372cf958cc4fc 100644 Binary files a/examples/screenshots/webgl_loader_collada_skinning.jpg and b/examples/screenshots/webgl_loader_collada_skinning.jpg differ diff --git a/examples/screenshots/webgl_loader_kmz.jpg b/examples/screenshots/webgl_loader_kmz.jpg index 9ff2d886018e0d..03100fec44381a 100644 Binary files a/examples/screenshots/webgl_loader_kmz.jpg and b/examples/screenshots/webgl_loader_kmz.jpg differ diff --git a/examples/webgl_loader_collada.html b/examples/webgl_loader_collada.html index 53edd8b3a340ba..ed24ecb288c028 100644 --- a/examples/webgl_loader_collada.html +++ b/examples/webgl_loader_collada.html @@ -81,6 +81,7 @@ // renderer = new THREE.WebGLRenderer(); + renderer.outputEncoding = THREE.sRGBEncoding; renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); container.appendChild( renderer.domElement ); diff --git a/examples/webgl_loader_collada_kinematics.html b/examples/webgl_loader_collada_kinematics.html index 7ce5f138330754..4bc8c18dfa753d 100644 --- a/examples/webgl_loader_collada_kinematics.html +++ b/examples/webgl_loader_collada_kinematics.html @@ -101,6 +101,7 @@ particleLight.add( pointLight ); renderer = new THREE.WebGLRenderer(); + renderer.outputEncoding = THREE.sRGBEncoding; renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); container.appendChild( renderer.domElement ); diff --git a/examples/webgl_loader_collada_skinning.html b/examples/webgl_loader_collada_skinning.html index 43880b15a30382..4cb67da0118225 100644 --- a/examples/webgl_loader_collada_skinning.html +++ b/examples/webgl_loader_collada_skinning.html @@ -94,6 +94,7 @@ // renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer.outputEncoding = THREE.sRGBEncoding; renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); container.appendChild( renderer.domElement ); diff --git a/examples/webgl_loader_kmz.html b/examples/webgl_loader_kmz.html index 4702aa9a9c6352..4b13a61ce2aae5 100644 --- a/examples/webgl_loader_kmz.html +++ b/examples/webgl_loader_kmz.html @@ -52,10 +52,11 @@ scene.add( camera ); - const grid = new THREE.GridHelper( 50, 50, 0xffffff, 0x555555 ); + const grid = new THREE.GridHelper( 50, 50, 0xffffff, 0x333333 ); scene.add( grid ); renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer.outputEncoding = THREE.sRGBEncoding; renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement );